选择.csv文件在第1列和第2列后停止工作

时间:2015-12-03 16:48:44

标签: sql excel vba csv

我在.csv文件中有以下行: 1234;Einkauf;26.08.2015;137873;616005;50308;Hiag;4100000;Place Rd. 8, 9999 Ort, HST;;;Test Place Rd. Ort;2000;VSM80;185.05;12;155.55;0.02

我运行以下代码:

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"";"

sQuery = vbNullString
sQuery = sQuery & "SELECT * FROM " & strFileName
sQuery = sQuery & ";"

rs.Open sQuery, cn

If Not (rs.EOF Or rs.BOF) Then
    If InclHeaders = False Then rs.Move 1

    ReDim rsArr(1 To 1)
    i = 1
    Do While Not rs.EOF
        ReDim Preserve rsArr(1 To i)
        For j = 0 To rs.Fields.Count - 1
            rsArr(i) = Trim(rsArr(i)) & " " & rs.Fields(j)
        Next j
        i = i + 1
        rs.MoveNext
    Loop
End If

一旦到达这里,前两次都很好: rsArr(i) = Trim(rsArr(i)) & " " & rs.Fields(j)

第三个字段返回0但不应该,因此rsArr(i)的值为1234;Einkauf;26.08.2015;137873;616005;50308;Hiag;4100000;Place Rd. 8, 9999 Ort

我不知道为什么会这样。它遍历字段,所以它不会在第二个字段后停止。

[该文件有两个标题行,这就是我移动rs的原因。但这并不重要,因为无论有多少标题行,错误都会发生。

编辑:前五行(如果我删除前两个标题行,我会遇到同样的问题,所以要小心对待)。

; Auftrag: 9161779,9162090,9162298,61601060,61601061,61601062,61601069,61601064,61601065,61601066,61601067
Konto;KontoBez;Datum;Blg Nr;OpNr;PkNr;PkName;Auftrag;AuftragText;Code;Vor;Buchungstext;G-Konto;MWST;BVS;BNS;NNS;Skonto
1234;Einkauf;10.10.2014;135729;14-02504;50309;Hofstetter;41401060;Place Rd. 8, 9999 Ort;;;Hofstetter Place Rd. 8, 9999 Ort;2000;VSM80;100.75;100.58;100.05;0.02
1234;Einkauf;10.10.2014;138182;1070011530;50326;Roto;41401060;Place Rd. 8, 9999 Ort;;;Roto Place Rd. 8, 9999 Ort;2000;VSM80;12.80;10.62;15.39;0.03
1234;Kunden 13;10.10.2014;5795;92140457;81853;;41401060;Place Rd. 8, 9999 Ort;;;AK:Place Rd. 8, 9999 Ort;1100;USt80;-12500.00;-12550.00;-12555.67;0

1 个答案:

答案 0 :(得分:0)

这是在黑暗中拍摄的,但是有多个标题可能存在一些数据类型混淆?如果是这样,我认为扩展属性末尾的IMEX=1;有助于管理具有不同数据类型的情况:

cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
    strPath & ";Extended Properties=""text;HDR=Yes;FMT=Delimited;IMEX=1"";"

如果这不起作用,可能会显示CSV文件的实际前5行,带标题和全部?它可能会跳出来。

作为替代方案,我无法帮助,但请注意您的数据文件似乎没有引用值。如果这在整个文件中是一致的,您可以采用惰性方法并将文件作为普通的分隔文件读取:

Dim fields() As String

Open strPath & "\" & strFileName for Input as #1

Do Until EOF(1)
  Line Input #1, line
  fields = Split(line, ",")
  ' your other stuff here
Loop

Close #1

通常需要注意的是,这与强大的CSV解析器相差甚远......