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 行,而文本框 1 的编号为 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

等这可能吗?非常感谢

4

2 回答 2

1

好的,我会试一试,尽管您的要求对于 SO 来说过于本地化,而且它不太可能对其他人有帮助。您的评论使问题可以回答。

一种方法是使用 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
于 2012-07-02T20:57:37.423 回答
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
于 2012-07-02T21:30:56.890 回答