2012-07-02 2 views
1

누군가 저에게 약간의 도움을 주실 수 있기를 바랍니다. 내 텍스트 파일에서 행을 변경하는 다음 코드는 기본적으로 텍스트 상자에서 숫자를 읽고 텍스트 상자의 숫자와 일치하는 행 수의 다른 텍스트 파일을 만듭니다. 코딩 잘 작동합니다.하나의 파일에서 다른 텍스트 파일을 만드시겠습니까?

Dim lines() As String = IO.File.ReadAllLines("C:\test1.txt") 
IO.File.WriteAllLines("C:\test1.txt", lines.Skip(CInt(TextBox1.Text)).toarray) 
IO.File.WriteAllLines("C:\test2.txt", lines.Take(CInt(TextBox1.Text)).toarray) 

이제 약간의 변경을 원했으며, 텍스트 상자에서 숫자를 읽고 5 개의 별도 텍스트 파일을 만드는 것이 좋겠다. 예를 들어 텍스트 파일 1에 60 개의 행이 있고 textbox1에 번호가 50 인 경우 코딩을 실행 한 후 다음 텍스트 파일을 갖습니다.

textfile 1 - 10 rows remaining 
textfile 2 - 10 rows 
textfile 3 - 10 rows 
textfile 4 - 10 rows 
textfile 5 - 10 rows 
textfile 6 - 10 rows 

이며 1 행을 갖는 textfile1의 경우

는 그럼 다음

textfile 1 - 0 rows remaining 
textfile 2 - 1 rows 
textfile 3 - 0 rows 
textfile 4 - 0 rows 
textfile 5 - 0 rows 
textfile 6 - 0 rows 

및 textfile1 5 가지고 있다면 그때는 것이다

textfile 1 - 0 rows remaining 
textfile 2 - 1 rows 
textfile 3 - 1 rows 
textfile 4 - 1 rows 
textfile 5 - 1 rows 
textfile 6 - 1 rows 

경우 싶습니다 텍스트 파일 1은 4를 가지므로

textfile 1 - 0 rows remaining 
textfile 2 - 1 rows 
textfile 3 - 1 rows 
textfile 4 - 1 rows 
textfile 5 - 1 rows 
textfile 6 - 0 rows 

등 가능합니까? 많은 감사

+0

'textbox1.Text' 값의 의미는 무엇입니까? 또한 사용자가 생성 할 파일 수를 지정할 수 있습니까? 어떤 줄이 어떤 파일에 있어야 하는가? –

+0

안녕 Tim, textbox1 값은 데이터 행을 의미합니다. 예를 들어 File1에 100 개의 데이터 행이 있고 textbox1에 숫자가 50 인 경우 이는 사용자가 File1에서 상위 50 개의 행을 제거하고 이러한 행으로 새 파일을 만들려고한다는 것을 의미합니다. 네, 죄송합니다, textbox2가 숫자 필드라는 것을 잊어 버렸습니다. 그리고 이것은 생성 된 텍스트 파일의 수입니다. – JackSparrow

+0

안녕하세요, 도와주세요. – JackSparrow

답변

1

여러분의 요구 사항이 너무 현지화되어있어 다른 사람에게 도움이되지 않을지라도 좋습니다. 귀하의 의견은 질문에 답할 수있게합니다.

Index Mod FileCount 한 가지 방법에 의해 그룹에 라인 LINQ를 사용 :

Dim lineCount = Decimal.ToInt32(NumericUpDown1.Value) 
Dim fileCount = Decimal.ToInt32(NumericUpDown2.Value) 
Dim file1Lines = IO.File.ReadAllLines("C:\test1.txt") 
Dim newFile1Lines = file1Lines.Skip(lineCount) 
Dim lineGroups = (
    file1Lines.Take(lineCount). 
       Select(Function(l, i) New With {.Line = l, .Index = i}). 
       GroupBy(Function(x) x.Index Mod fileCount). 
       Select(Function(grp) New With { 
          .FileIndex = grp.Key, 
          .Lines = grp.Select(Function(x) x.Line) 
       })) 

IO.File.WriteAllLines("C:\test1.txt", newFile1Lines) 
For i = 0 To fileCount - 1 
    Dim path = String.Format("C:\test{0}.txt", i + 2) 
    Dim lineGroup = lineGroups.FirstOrDefault(Function(lg) lg.FileIndex = i) 
    If lineGroup Is Nothing Then 
     IO.File.WriteAllLines(path, {""}) 
    Else 
     IO.File.WriteAllLines(path, lineGroup.Lines) 
    End If 
Next 
+0

@ JackSparrow : 수락 한 후 내 대답을 수정했습니다. 메모리 소비를 최소화하기 위해 ToDictionary를 제거했습니다. –

1

더 낮은 메모리 소비; 한 번에 한 행만 RAM에 저장됩니다 :

Dim files As Integer = 5 
Dim lines As Integer = 50 

Using rdr As New IO.StreamReader("C:\test1.txt") 

    Dim output(files) As StreamWriter 
    For i As Integer = 0 To files 
     output(i) = New StreamWriter(String.Format("C:\test{0}.txt",i+1)) 
    Next i 

    Try 

     Dim currentStream As Integer = 1 
     Dim line As String 
     While (line = rdr.ReadLine()) <> Nothing 
      If lines > 0 Then 
       output(currentStream).WriteLine(line) 
       currentStream += 1 
       If currentStream > files Then currentStream = 1 
       lines -= 1 
      Else 
       output(0).WriteLine(line) 
      End If 

     End While 

    Finally 
     For Each writer As StreamWriter In output 
      writer.Close() 
     Next writer 
    End Try 
End Using 
+0

테스트 해 보셨습니까? 새로운 IO.StreamReader ("C : \ test1.txt")를 사용하면 새로운 StreamWriter (String.Format ("C : \ test {0} .txt)의 다음 For 루프에서 IOException이 발생합니다. ", i + 1))'. 'While 루프'는 절대로 들어 가지 않습니다. 그 외에는 OP의 요구 사항에 맞는지 확실하지 않습니다. 라인을 모든 파일로 동등하게 나누어서는 안됩니다. 첫 번째 파일은 예외입니다. –

+0

답장 창에 직접 입력했습니다. 여기서 문제는 생성자에서 별도의 스트림이 읽기 및 쓰기를 위해 파일을 동시에 열 수 있도록 추가 인수가 필요하다는 것입니다. 그렇지 않으면 currentStream이 0으로 설정되지 않기 때문에 첫 번째 파일을 차지했습니다. –

관련 문제