我的文本数据文件是这样的:
{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文件。这可以帮助我们很多时间。
答案 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,,,,
我注意到最后一列都没有数据。这只是一个复制粘贴错误还是故意的?
编辑:我使用选项推断,这就是为什么缺少某些类型声明的原因。