vb.net xls到带引号的csv?

时间:2011-03-09 18:50:28

标签: vb.net excel ms-access csv xls

我有一个xls文件,或者没有引号的csv,并且使用vb.net需要将其转换为带有每个单元格周围引号的csv。如果我在MS Access中打开没有引号的xls / csv,请将每个列设置为文本,然后将其导出为我需要的格式。有没有更简单的方法?如果没有,我该如何在vb.net中复制这个?感谢。

3 个答案:

答案 0 :(得分:2)

如果您使用.Net OLE DB provider,则可以在数据文件所在的文件夹中的schema.ini文件中指定.csv格式详细信息。对于“未加引号”的.csv规范 应该看起来像

[noquotes.csv]        <-- file name
ColNameHeader=True    <-- or False
CharacterSet=1252     <-- your encoding
Format=Delimited(,)   <-- 
TextDelimiter=        <-- important: no " in source file
Col1=VendorID Integer <-- your columns, of course
Col2=AccountNumber Char Width 15

对于'引用'.csv,只需更改名称并删除TextDelimiter =行(默认情况下在文本字段周围放置引号)。

然后连接到文本数据库并执行语句

SELECT * INTO [quotes.csv] FROM [noquotes.csv]

(因为这会创建quotes.csv,您可能希望在每次实验运行之前删除该文件)

已添加处理“必须引用空字段”

这是一个VBScript演示,但重要的是.GetString()的参数,你可以轻松地将它移植到VB:

    Dim sDir   : sDir       = resolvePath( "§LibDir§testdata\txt" )
    Dim sSrc   : sSrc       = "noquotes.csv"
    Dim sSQL   : sSQL       = "SELECT * FROM [" & sSrc & "]"
    Dim oTxtDb : Set oTxtDb = New cADBC.openDb( Array( "jettxt", sDir ) )
    WScript.Echo goFS.OpenTextFile( goFS.BuildPath( sDir, sSrc ) ).ReadAll()
    Dim sAll : sAll = oTxtDb.GetSelectFRO( sSQL ).GetString( _
                             adClipString, , """,""", """" & vbCrlf & """", "" _
                      )
    WScript.Echo   """" & Left( sAll, Len( sAll ) - 1 )

并输出:

    VendorID;AccountNumber;SomethingElse
    1;ABC 123 QQQ;1,2
    2;IJK 654 ZZZ;2,3
    3;;3,4

    "1","ABC 123 QQQ","1,2"
    "2","IJK 654 ZZZ","2,3"
    "3","","3,4"

(德语区域设置,因此是字段分隔符;和小数点符号)

此VB.Net代码的相同输出:

    Imports ADODB
    ...

        Sub useGetString()
            Console.WriteLine("useGetString")

            Const adClipString As Integer = 2
            Dim cn As New ADODB.Connection
            Dim rs As ADODB.Recordset
            Dim sAll As String

            cn.ConnectionString = _
                 "Provider=Microsoft.Jet.OLEDB.4.0;" _
               & "Data Source=M:\lib\kurs0705\testdata\txt\;" _
               & "Extended Properties=""text;"""

            cn.Open()
            rs = cn.Execute("SELECT * FROM [noquotes.csv]") 
            sAll = rs.GetString( adClipString, , """,""", """" & vbCrLf & """", "" )
            cn.Close()
            sAll = """" & Left( sAll, Len( sAll ) - 1 )
            Console.WriteLine( sAll )
        End Sub

答案 1 :(得分:1)

查看this link处的方法。 你可以做些什么来确保引号四处是在将循环中的列数据放入文件的每个列数据的开头和结尾附加引号。

例如,像这样制作循环:

For InnerCount = 0 To ColumnCount - 1
    Str &= """" & DS.Tables(0).Rows(OuterCount).Item(InnerCount) & ""","
Next

答案 2 :(得分:-1)

Public Class clsTest

Public Sub Test
Dim s as string = "C:\!Data\Test1.csv"

        Dim Contents As String = System.IO.File.ReadAllText(s)


        Dim aryLines As String() = Contents.Split(New String() { Environment.Newline }, StringSplitOptions.None)
        Dim aryParts() As String
        Dim aryHeader() As String
        Dim dt As System.Data.DataTable 
        For i As Integer = 0 To aryLines.Length - 1
            aryParts = SplitCSVLine(aryLines(i))
            If dt Is Nothing And aryHeader Is Nothing Then 
                aryHeader = CType(aryParts.Clone, String())
            ElseIf dt Is Nothing And aryHeader IsNot Nothing Then
                dt = DTFromStringArray(aryParts, 1000, "", aryHeader)
            Else
                DTAddStringArray(dt, aryParts)
            End If
        Next
        dt.dump
End Sub 

Public Shared Function SplitCSVLine(strCSVQuotedLine As String) As String()
        Dim aryLines As String() = strCSVQuotedLine.Split(New String() {Environment.NewLine}, StringSplitOptions.None)
        Dim aryParts As String() = Nothing
        For i As Integer = 0 To aryLines.Length - 1
            Dim regx As New Text.RegularExpressions.Regex(",(?=(?:[^\""]*\""[^\""]*\"")*(?![^\""]*\""))")
            aryParts = regx.Split(aryLines(i))
            For p As Integer = 0 To aryParts.Length - 1
                aryParts(p) = aryParts(p).Trim(" "c, """"c)
            Next
        Next
        Return aryParts
End Function

Public Shared Function DTFromStringArray(ByVal aryValues() As String, Optional ByVal intDefaultColumnWidth As Integer = 255, Optional ByVal strTableName As String = "tblArray", Optional ByVal aryColumnNames() As String = Nothing) As DataTable
        If String.IsNullOrWhiteSpace(strTableName) Then strTableName = "tblArray"
        Dim dt As DataTable = New DataTable(strTableName)
        Dim colNew(aryValues.GetUpperBound(0)) As DataColumn
        If aryColumnNames Is Nothing Then
            ReDim aryColumnNames(aryValues.Length)
        Else
            If aryColumnNames.GetUpperBound(0) < aryValues.GetUpperBound(0) Then
                ReDim Preserve aryColumnNames(aryValues.Length)
            End If
        End If
        For x As Integer = aryColumnNames.GetLowerBound(0) To aryColumnNames.GetUpperBound(0)
            If String.IsNullOrWhiteSpace(aryColumnNames(x)) Then
                aryColumnNames(x) = "Field" & x.ToString
            Else
                aryColumnNames(x) = aryColumnNames(x)
            End If
        Next
        For i As Integer = 0 To aryValues.GetUpperBound(0)
            colNew(i) = New DataColumn
            With colNew(i)
                .ColumnName = aryColumnNames(i) '"Value " & i
                .DataType = GetType(String)
                .AllowDBNull = False
                .DefaultValue = ""
                .MaxLength = intDefaultColumnWidth
                .Unique = False
            End With
        Next
        dt.Columns.AddRange(colNew)
        Dim pRow As DataRow = dt.NewRow
        For i As Integer = aryValues.GetLowerBound(0) To aryValues.GetUpperBound(0)
            pRow.Item(i) = aryValues(i)
        Next
        dt.Rows.Add(pRow)
        Return dt
End Function

Public Shared Sub DTAddStringArray(ByRef dt As DataTable, ByVal aryRowValues() As String)
        Dim pRow As DataRow
        pRow = dt.NewRow
        For i As Integer = aryRowValues.GetLowerBound(0) To aryRowValues.GetUpperBound(0)
            pRow.Item(i) = aryRowValues(i)
        Next
        dt.Rows.Add(pRow)
End Sub

End Class