重新格式化csv文件

时间:2021-03-06 15:49:28

标签: vb.net csv

我有一个具有以下格式的 csv 文件:

Line,Title1,Title2,Title3,Title4,Title5
181,25.1,225.2,-7,120.3,35
180,10.1,325.2,-5,320.3,20
179,0.1,525.2,-2,520.3,0
178,0.1,525.3,-2,520.5,0
177,0.1,525.3,-2,520.6,0

我想将其格式化为以下结构:

Line;Title;Value
181,Title1,25.1
181,Title2,225.2
181,Title3,-7
181,Title4,120.3
181,Title5,35
182,Title1,10.1
182,Title2,325.2
182,Title3,-5
182,Title4,320.3
182,Title5,20

到目前为止,我已经将 csv 导入到具有以下功能的数据表中:

Public Function CsvToDatatable(ByVal filename As String, ByVal separator As String)
    'Dim dt As New System.Data.DataTable
    'Dim firstLine As Boolean = True
    Dim myDate As DateTime

    If IO.File.Exists(filename) Then
        Using sr As New StreamReader(filename)
            While Not sr.EndOfStream
                If firstLine Then
                    firstLine = False
                    Dim cols = sr.ReadLine.Split(separator)
                    For Each col In cols
                        If col <> "Title" Then
                            dt.Columns.Add(New DataColumn(col, GetType(Decimal)))
                        Else
                            dt.Columns.Add(New DataColumn(col, GetType(String)))
                        End If

                    Next
                Else
                    Dim data() As String = sr.ReadLine.Split(separator)
                    'Dim oDate As DateTime = Convert.ToDateTime(data(0))
                    'data(0) = oDate
                    dt.Rows.Add(data.ToArray) 
                End If
            End While
        End Using
    End If
    Return dt
End Function

我的想法是通过另一个函数将数据表转换为新格式。但我不知道如何做到这一点。 实现这一目标的最简单方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以简单地随时编写输出 CSV,而不是将其加载到数据表中。以下代码实现了这一点:

Public Sub ConvertCsv(sourceFile As String, destinationFile As String, delimiter As String)

    If IO.File.Exists(sourceFile) Then

        Dim reader As New StreamReader(sourceFile)
        Dim writer As New StreamWriter(destinationFile)

        Dim headers As String()

        If Not reader.EndOfStream Then

            ' Read headers
            headers = reader.ReadLine.Split(delimiter)

            While Not reader.EndOfStream

                Dim line As String = reader.ReadLine
                Dim values = Split(line, delimiter)
                Dim item As String

                ' Save first column as the item name
                item = values(0)

                ' Loop through remaining columns
                For counter As Integer = 1 To values.Count - 1

                    ' Write line with values to destination file
                    writer.WriteLine(item & delimiter & headers(counter) & delimiter & values(counter))

                Next

            End While

        End If

        ' CLose files
        reader.Close()
        writer.Close()

    End If

End Sub