在Vb.Net中,如何编写没有回车符的.csv文件?

时间:2014-09-22 17:26:41

标签: vb.net vb.net-2010

我正在研究VS 2012,Vb.Net - .Net 4.0框架。

我的Vb.Net代码正在读取.csv文件,预计会在没有回车的情况下重写该文件。

但现在,Carriage Return Line Feed在.csv文件中创建为新行。 如何删除CR LF ??

  Public Sub Test()
            Try

                Dim reader As StreamReader = New System.IO.StreamReader(File.OpenRead("D:\CSV\Test.csv"))
                Dim listA As New List(Of String)()


                If File.Exists("d:\CSV\TestOut.csv") Then
                    File.Delete("d:\CSV\TestOut.csv")
                End If

                Dim sw As New StreamWriter("d:\CSV\TestOut.csv")
                Dim s As String = String.Empty

                While reader.Peek() >= 0
                    Dim line As String = reader.ReadLine()
                    Dim values As String() = line.Split(";"c)
                    listA.Add(values(0))
                    s = s + line + Chr(10)
                End While
                reader.Close()
                sw.WriteLine(s)
                sw.Close()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

        End Sub

1 个答案:

答案 0 :(得分:0)

我看不出listAvalues变量有什么用处。 CRLF到LF任务不需要它们。

请参阅:

Try
    If File.Exists("D:\CSV\Output.csv") Then File.Delete("D:\CSV\Output.csv")


    Using reader As New StreamReader(File.OpenRead("D:\CSV\Input.csv"))
    Using writer As New StreamWriter("D:\CSV\Output.csv")
        Dim strBldr As New Text.StringBuilder

        While reader.Peek > -1 ' Seen like this at MSDN page for Peek() function
            Dim line = reader.ReadLine
            ' If you really need the first value of each line, you can still do it here.
            strBldr.Append(line).Append(Chr(10))
        End While

        writer.Write(strBldr.ToString)
    End Using
    End Using
Catch ex As Exception
    MsgBox(ex.Message)
End Try
  1. 您应该使用Using - Streams的关键字。离开时,End Using将关闭并Dispose()流对象。它总会这样做,即使抛出异常或你return一个值;就像Finally块中的Try语句一样。

  2. 当您在String之后经常展开s = s + line + Chr(10) - 变量时,请考虑使用针对此优化的StringBuilder

  3. 当您需要列表中的第一个值和第一个值时,line.Split({";"c}, 2)将拆分第一个值并将大部分值作为一个String而不是数百个{{1}仅用于垃圾收集的对象。更合适的是使用String根本不会产生休息。