我希望有人可以给我一点帮助吗?我有以下编码更改我的文本文件中的行,它基本上从文本框中读取一个数字,并创建另一个文本文件,其行数与文本框中的数字相匹配。编码工作正常。
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个单独的文本文件。因此,例如,如果textfile 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
并且如果textfile1只有1行,那么我想要以下
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
如果textfile1有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 :(得分:1)
好的,我会尝试一下,虽然你的要求过于本地化而且它不太可能对任何人都有帮助。您的评论使问题变得可以回答。
一种方法是使用LINQ按Index Mod FileCount
:
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
答案 1 :(得分: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