-1

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

{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来做到这一点吗?我很长一段时间(超过 10 年)没有使用 VB。

对不起。我没有说清楚。

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

(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文件。这可以帮助我们很多时间。

4

2 回答 2

0

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

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

仅供参考,如果不进一步了解您需要做什么,很难为您提供进一步的建议?例如,文件的大小、您需要多久执行一次、目标格式是什么等等……

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

于 2013-03-21T17:53:00.463 回答
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,,,,

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

编辑:我使用Option Infer On,这就是缺少某些类型声明的原因。

于 2013-03-22T23:12:53.287 回答