2017-10-22 14 views
0

내 프로그램에서는 수십만에서 수백만 줄의 대규모 정보를 수집합니다. 나는 그것을 열 수 있고 데이터를 읽을 수 있도록하기 위해 내가 만든 각 파일을 특정 크기로 제한하려고합니다. 중복없이 모든 데이터를 수집하기 위해 HashSet을 사용하고 있습니다. 여기 각각의 크기를 제한하면서 여러 .txt 파일 만들기

지금까지 내 코드입니다 :

Dim Founds As HashSet(Of String) 
Dim filename As String = (Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\Sorted_byKING\sorted" + Label4.Text + ".txt") 
Using writer As New System.IO.StreamWriter(filename) 
    For Each line As String In Founds 
     writer.WriteLine(line) 
    Next 
    Label4.Text = Label4.Text + 1 'Increments sorted1.txt, sorted2.txt etc 
End Using 

그래서, 내 질문은 :

내가 저장 가야합니까 방법의 또 다른로 이동하기 전에 텍스트 파일의 25 개 라인을 가정 해 봅시다 하나 그리고 다음 250,000을 추가 하시겠습니까?

답변

0

우선 레이블을 사용하여 단순히 값을 저장하지 마십시오. 대신 변수를 사용해야합니다. 변수가 그 대상입니다.

또 다른 조언은 항상 Path.Combine을 사용하여 경로의 각 부분이 구분 기호로 끝나는 지 여부를 걱정할 필요가 없습니다. 당신이 삽입 될 경우, 그러나

Sub SplitAndWriteLineByLine() 
    Dim Founds As HashSet(Of String) 'Don't forget to initialize and fill your HashSet 
    Dim maxLinesPerFile As Integer = 250000 

    Dim fileNum As Integer = 0 
    Dim counter As Integer = 0 
    Dim filename As String = String.Empty 

    Dim writer As IO.StreamWriter = Nothing 

    For Each line As String In Founds 
     If counter Mod maxLinesPerFile = 0 Then 
      fileNum += 1 
      filename = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), 
             $"Sorted_byKING\sorted{fileNum.ToString}.txt") 
      If writer IsNot Nothing Then writer.Close() 
      writer = New IO.StreamWriter(filename) 
     End If 
     writer.WriteLine(line) 
     counter += 1 
    Next 
    writer.Dispose() 
End Sub 

: 이제

는 귀하의 질문에 대답 : 당신이 라인으로 텍스트 줄을 삽입하려는 경우

을, 당신은 같은 것을 사용할 수 있습니다 을 HashSet에서 그대로 사용하면 한 행씩 작성할 필요가 없으므로 한 번에 한 줄씩 "묶음"을 작성할 수 있습니다. 다음과 같은 것을 사용할 수 있습니다 :

Sub SplitAndWriteAll() 
    Dim Founds As HashSet(Of String) 'Don't forget to initialize and fill your HashSet 
    Dim maxLinesPerFile As Integer = 250000 

    Dim fileNum As Integer = 0 
    Dim filename As String = String.Empty 
    For i = 0 To Founds.Count - 1 Step maxLinesPerFile 
     fileNum += 1 
     filename = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), 
            $"Sorted_byKING\sorted{fileNum.ToString}.txt") 
     IO.File.WriteAllLines(filename, Founds.Skip(i).Take(maxLinesPerFile)) 
    Next 
End Sub 
+0

두 번째 것을 단 한번만 테스트하십시오. 이 두 가지 모두 훌륭해 보이지만 고맙습니다. –