将文本数据文件转换为csv格式

时间:2013-03-21 17:35:24

标签: vb.net

我的文本数据文件是这样的:

{1000}xxx{1200}xxx{3000}xxxxxx{5000}
{1000}xx{1500}xxxxxx{4000}xx{6000}
{1000}xxxx{1600}xxx{3000}xxx{6000}
...

我需要将此数据文件转换为csv文件或excel文件进​​行分析。我试过Excel或其他转换软件。但它没有用。

我可以用VB来做吗?我很长时间没有使用VB(超过10年)。

对不起我没说清楚。

大括号中的数字是字段名称。每条记录都没有相同的字段。转换后的结果应该是这样的:

(header line) 1000  1200 1500 1600 3000 4000 5000 6000
(record line)  xxx   xxx            xxx       xxx
      .        xxx        xxx            xxx       xxx
      .        xxx             xxx  xxx            xxx

我们每天都有文本数据文件(10 - 20条记录)。虽然数据不大,但如果我们可以转换为csv文件,我们不需要重新输入excel文件。这可以帮助我们很多时间。

2 个答案:

答案 0 :(得分:0)

您几乎肯定可以使用编程语言(如VB)来进行此更改。我不确定你是否需要这样做。

如果您正在尝试编写一个程序来反复转换相同类型的文件,那么在VB.net中构建程序可能是有意义的。

仅供参考,在没有更多了解您需要做什么的情况下,很难提供进一步的建议吗?例如,文件的大小,您需要的频率,目标格式等等......

...但我提供的答案确实回答了你问的问题! ......我正在寻求代表点;)

答案 1 :(得分:0)

根据您对数据结构的解释:

Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions

Module Module1

    Class Cell
        Property ColumnName As String
        Property Value As String

        ' To help with debugging/general usage
        Public Overrides Function ToString() As String
            Return String.Format("Col: {0} Val: {1}", ColumnName, Value)
        End Function
    End Class

    Dim table As New List(Of List(Of Cell))

    Sub Main()
        Dim src As String = "C:\temp\sampledata.txt"
        Dim dest = "C:\temp\sampledata.csv"

        Dim colNames As New List(Of String)

        ' This regex will look for zero or more characters ".*" surrounded by braces "\{ \}" and
        ' collect the zero or more characters in a group "( )". The "?" makes it non-greedy.
        ' The second capture group "( )" gets all the characters up to but not including
        ' the next "\{" (if it is present).
        Dim cellSelector = New Regex("\{(.*?)\}([^\{]*)")

        ' Read in the cells and record the column names.
        Using inFile = New StreamReader(src)
            While Not inFile.EndOfStream
                Dim line = inFile.ReadLine
                Dim rowContent As New List(Of Cell)
                For Each m As Match In cellSelector.Matches(line)
                    rowContent.Add(New Cell With {.ColumnName = m.Groups(1).Value, .Value = m.Groups(2).Value})
                    If Not colNames.Contains(m.Groups(1).Value) Then
                        colNames.Add(m.Groups(1).Value)
                    End If
                Next
                table.Add(rowContent.OrderBy(Function(c) c.ColumnName).ToList)
            End While
        End Using

        colNames.Sort()

        ' add the header row of the column names
        Dim sb As New StringBuilder(String.Join(",", colNames) & vbCrLf)

        ' output the data in csv format
        For Each r In table

            Dim col = 0
            Dim cellNo = 0

            While cellNo < r.Count AndAlso col < colNames.Count
                ' If this row has a cell with the appropriate column name then
                ' add the value to the output.
                If r(cellNo).ColumnName = colNames(col) Then
                    sb.Append(r(cellNo).Value)
                    cellNo += 1
                End If

                ' add a separator if is not the last item in the row
                If col < colNames.Count - 1 Then
                    sb.Append(","c)
                End If

                col += 1

            End While

            sb.AppendLine()

        Next

        File.WriteAllText(dest, sb.ToString)

    End Sub

End Module

从您的示例数据中,输出

1000,1200,1500,1600,3000,4000,5000,6000
xxx,xxx,,,xxxxxx,,,
xx,,xxxxxx,,,xx,,,
xxxx,,,xxx,xxx,,,,

我注意到最后一列都没有数据。这只是一个复制粘贴错误还是故意的?

编辑:我使用选项推断,这就是为什么缺少某些类型声明的原因。