Sql 在.csv文件上选择在第1列和第2列之后停止工作
我在Sql 在.csv文件上选择在第1列和第2列之后停止工作,sql,excel,vba,csv,Sql,Excel,Vba,Csv,我在.csv文件中有以下行: 1234;艾因考夫;26.08.2015;137873;616005;50308;Hiag;4100000;香港南区奥特广场路8号,9999号;;;试验场道;2000;VSM80;185.05;12;155.55;0.02 我运行以下代码: Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open "Provider=Microsoft.ACE
.csv
文件中有以下行:
1234;艾因考夫;26.08.2015;137873;616005;50308;Hiag;4100000;香港南区奥特广场路8号,9999号;;;试验场道;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)=修剪(rsArr(i))和“&rs.Fields(j)
第三个字段返回0,尽管它不应该返回,因此rsArr(i)
的值是1234;艾因考夫;26.08.2015;137873;616005;50308;Hiag;4100000;Place路8号,9999 Ort
我不知道为什么会这样。它在字段中循环,因此在第二个字段之后不会停止
[文件有两个标题行,这就是为什么我要移动rs
。不过这并不重要,因为无论标题行有多少,错误都会不断发生
编辑:前五行(如果删除前两行标题行,我会遇到同样的问题,因此请小心处理)
这是瞎猜,但对于多个标题,是否可能存在一些数据类型混淆?如果是这样,我认为扩展属性末尾的
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解析器相去甚远…您只有一个一维数组。您不需要2吗?在循环的第一次迭代中,您的数组被定义为rsArr(1)。这意味着当您在列中循环时,您只能填充rsArr(0)和rsArr(1)在空间不足之前。这是因为您已经动态调暗了数组中的行数,但没有调暗列的任何空间。我正在先将行合并,然后在第二次迭代中按“;”分割。问题是数据源(即csv文件)是一个clusterfuck,我需要操纵它才能使用它。所以目前我只需要一个一维数组。我添加了
.csv
文件的前五行。我现在使用你的解决方案来解决我的问题。我仍然觉得它不能正常工作非常奇怪。
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