【问题标题】:Converting space delimited text file to CSV VB.NET将空格分隔的文本文件转换为 CSV VB.NET
【发布时间】:2013-06-10 14:50:09
【问题描述】:

我有数百个以空格分隔的文本文件,我想根据 RFC 4180 在 VB.NET 中将它们转换为 CSV 文件。这些文件的长度不同,但最多可以包含 200000 行,并且具有不同数量的列(最多 30)由多个“空格”分隔,这些“空格”也在 1 到 20 之间变化。文件包含一些我想删除的信息,例如第一列,我还想更改第二列的内容转换为有效的 Javascript 时间戳。这是其中一个文件的第一行的示例(请注意,大部分空格未显示)。

#时间顺序boil_q_1boil_q_2 chil_q1 chil_q2 loccool locheat qdomwat
0.000000000 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31529E-03 132.39 9799.3 0.0000
8.0000000000E-02 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31528E-03 132.11 9917.1 0.0000
0.1600000000 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31527E-03 131.98 10047.0.0000
0.2705515735 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31527E-03 131.97 10152.0.0000
0.2705515763 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31526E-03 131.97 10152.0.0000
0.3345515763 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31525E-03 131.97 10184.0.0000
0.3985515763 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31524E-03 131.98 10192.0.0000
0.5265515763 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31524E-03 131.98 10178.0.0000
0.7825515763 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31523E-03 131.99 10164.0.0000
0.7825515791 1.0000 4.18700E-09 0.0000 4.18700E-11 1.31522E-03 131.99 10164.0.0000

欢迎提出任何建议。

真诚的 最大

【问题讨论】:

  • 欢迎来到 Stack Overflow。您能否向我们展示您目前处理此问题的尝试,以便我们知道如何提供帮助?
  • 我想到了逐行阅读并使用 Dim split As String() = Text.Split(" ") Dim s As String For Each s In split If s.Trim() "" Then Console.WriteLine(s) End If Next s 但必须有更好的方法。
  • 这可能是最简单的方法。在编写 CSV 文件时,您必须输出逗号并将字段值用双引号括起来。
  • 因为你不知道会有多少空格,我想说你最好的选择是使用Regex.Replace 使用\s* 的正则表达式和你的新分隔符 - , csv.
  • 听起来不错,从未听说过 Regex.Replace

标签: vb.net text space delimited


【解决方案1】:

假设不同数量的空格不是因为列是空的...

我会保持简单并使用我习惯的字符串工具,粗略但对我来说很快:

    Dim s As String = TextBox1.Text
    s = s.Replace(vbNewLine, "|").Replace(vbCr, "").Replace(vbLf, "")
    s = s.Replace("| ", "|") ' trim leading space
    Dim iLen As Integer = -1
    Do
        iLen = s.Length
        s = s.Replace("  ", " ")
    Loop Until iLen = s.Length
    Dim aLines() As String = s.Split("|")
    Dim aLine() As String
    Dim aHeader() As String = aLines(0).Split(" ")
    ' process header
    For i As Long = 1 To aLines.GetUpperBound(0)
        aLine = aLines(i).Split(" ")
        Stop
        ' process line
    Next

TextBox1 包含您的样品与流浪?领导 #。如果不同的空间是由于空列造成的,那么按摩会更复杂,并且可能在内部循环中更好地完成。

上面我只是按摩整个字符串,然后将这些线放入一个数组中,然后遍历这些线。

这是 OP 中唯一的第一步。

我发现编写 CSV 是有问题的,尤其是因为消费者有时对规范所说的内容有不同的想法。如果可能,请使用最终消耗程序进行测试。

【讨论】:

    【解决方案2】:

    我最终使用了以下代码并将信息添加到数据网格中

    Dim rowvalue As String
    Dim streamReader As IO.StreamReader = New IO.StreamReader(FileName)
        While streamReader.Peek() <> -1
        rowvalue = streamReader.ReadLine()
        DataGridView1.Rows.Add(rowvalue.Split(New String() {" "}, StringSplitOptions.RemoveEmptyEntries))
    End While
    

    问题是它相当慢,我仍然需要删除其中一个文件并添加所有其他文件。我想以其他方式存储信息会更容易吗?有什么想法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多