vbscript:如何用ado查询csv并返回csv

Posted

技术标签:

【中文标题】vbscript:如何用ado查询csv并返回csv【英文标题】:vbscript: how to query csv with ado and return csv 【发布时间】:2016-04-06 15:30:39 【问题描述】:

我正在尝试使这个脚本工作(有一些 vba 知识,但不知道 vbs 的差异。我试图适应的解决方案在这里: VB Script to dump an SQL Server table to CSV 和 https://msdn.microsoft.com/en-us/library/ms974559.aspx

它应该读取 csv 文件,对其运行 ACE SQL 查询并将结果返回到另一个 CSV

它只生成一个空的 Output.csv 文件,并且它被锁定以进行编辑。你能帮帮我吗:

On Error Resume Next 

Const adOpenStatic = 3 
Const adLockOptimistic = 3 
Const adCmdText = &H0001 

Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 

strPathtoTextFile = "C:\Databases\" 

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
          "Data Source=" & strPathtoTextFile & ";" & _ 
          "Extended Properties=""text;HDR=YES;FMT=Delimited""" 

rs.Open "SELECT * FROM PhoneList.csv", _ 
          objConnection, adOpenStatic, adLockOptimistic, adCmdText 


Set fso=CreateObject("Scripting.FileSystemObject")
Set ts=fso.OpenTextFile("c:\Databases\output.csv",2,TRUE)
line=""
For Each tmp In objRecordset.Fields
   line=line & tmp.Name & ","
Next

ts.WriteLine Left(line,Len(line)-1)
While Not rs.EOF
 line=""
 For Each tmp In rs.Fields
  If IsNull(tmp.Value) Then
   line=line & """" & Replace(tmp.Value,"""","""""") & ""","
  Else
   line=line & """" & tmp.Value & ""","
  End If
 Next
 ts.WriteLine Left(line,Len(line)-1)
 rs.MoveNext
Wend

Set rs = Nothing
ts.close
rs.close
fso.close

cn.Close

我了解一些 VBA,但无法在此 VBS 中找到出路。你能帮我找出我做错了什么吗?

其次...是否可以使所有数据路径都相对于脚本本身,以便分发解决方案?我知道如何在 vba 中做到这一点,但不知道是否可以使用 vbscript?

我相信这样的模板对所有社区都非常有帮助。如果我的问题表述不当,我将虚心接受批评。

【问题讨论】:

1. objRecordset 可能应该是 rs 2。strPathtoTextFile 可以更改为将输入路径更改为相对 3。Set ts=fso.OpenTextFile("c:\Databases\output.csv",2,TRUE) 可以更改为将输出路径更改为相对 4。在循环中,您可以使用 wscript.echo Left(line,Len(line)-1) 确定您是实际从输入文件中读取数据 你是对的。我更正了1)。仍然存在一些主要问题......它会生成一个输出文件,该文件被锁定以进行编辑并且为空。 去掉“On Error Resume Next”重新运行;您会发现需要进行一些更改。必须明智地使用“On Error Resume Next”;它可以掩盖你想看到的错误。 【参考方案1】:

我在这里添加代码的工作版本。删除“On Error Resume Next”并尝试修复突出显示的错误应该对您有所帮助。没有很多,它们不难修复,但练习应该是有益的。这是代码的工作版本:

On Error Resume Next 

Const adOpenStatic = 3 
Const adLockOptimistic = 3 
Const adCmdText = &H0001 

Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 

strPathtoTextFile = "C:\Databases\"

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
          "Data Source=" & strPathtoTextFile & ";" & _ 
          "Extended Properties=""text;HDR=YES;FMT=Delimited""" 

rs.Open "SELECT * FROM PhoneList.csv", _ 
          cn, adOpenStatic, adLockOptimistic, adCmdText 


Set fso=CreateObject("Scripting.FileSystemObject")
Set ts=fso.OpenTextFile(strPathtoTextFile & "output.csv",2,TRUE)
line=""
For Each tmp In rs.Fields
   line=line & tmp.Name & ","
Next
ts.WriteLine Left(line,Len(line)-1)

While Not rs.EOF
 line=""
 For Each tmp In rs.Fields
  If IsNull(tmp.Value) Then
   line=line & """" & Replace(tmp.Value,"""","""""") & ""","
  Else
   line=line & """" & tmp.Value & ""","
  End If
 Next
 ts.WriteLine Left(line,Len(line)-1)
 rs.MoveNext
Wend

rs.close
Set rs = Nothing
ts.close
cn.Close

【讨论】:

亲爱的迈克。感谢帮助。我将代码粘贴到 vba 编辑器中的子程序中,它在第 22 行停止,运行时错误“70”权限被拒绝。作为 vbs 代码运行,它在第 12 行停止,声称“找不到提供程序。它可能没有正确安装。代码 800A0E7A 源:ADODB.Connection “权限被拒绝”可能是因为您正在写信到您不应该在的位置。您可能需要更改输出位置。至于“找不到提供程序”,这很不寻常,因为所需的文件长期以来一直是 Windows 默认安装的一部分。以下 SO 讨论有几个建议:***.com/questions/2508037/…

以上是关于vbscript:如何用ado查询csv并返回csv的主要内容,如果未能解决你的问题,请参考以下文章

如何用DataSet 和SqlDataAdapter读取SQL数据库中某列的多行数据?

VBscript和ADO - 3704关闭对象时不允许操作

如何用python读写CSV 格式文件

如何用SQL语句查询Excel数据

如何用vb修改csv文件

你如何用 awk 解析逗号分隔值(csv)?