Regex VBscript有模块吗?我需要处理CSV
我需要读取CSV文件,唯一可以使用的语言是VBscript 我目前正在打开文件并用逗号分割,它工作正常,因为字段中没有任何带引号的逗号。但我知道这是一个非常脆弱的解决方案 那么,我可以使用VBscript模块吗?在什么地方可以得到一个经过测试的正则表达式,它只能在逗号上拆分,而不能在引号中拆分Regex VBscript有模块吗?我需要处理CSV,regex,vbscript,csv,module,split,Regex,Vbscript,Csv,Module,Split,我需要读取CSV文件,唯一可以使用的语言是VBscript 我目前正在打开文件并用逗号分割,它工作正常,因为字段中没有任何带引号的逗号。但我知道这是一个非常脆弱的解决方案 那么,我可以使用VBscript模块吗?在什么地方可以得到一个经过测试的正则表达式,它只能在逗号上拆分,而不能在引号中拆分 非常感谢您的建议。您可以尝试将Excel ODBC数据源创建为CSV(我想称为DSN)。它位于控制面板->管理工具->ODBC数据源中。然后,您可以使用SQL查询它 我仍然不确定你是否能得到你想要的。我的
非常感谢您的建议。您可以尝试将Excel ODBC数据源创建为CSV(我想称为DSN)。它位于控制面板->管理工具->ODBC数据源中。然后,您可以使用SQL查询它
我仍然不确定你是否能得到你想要的。我的意思是插入一个带有逗号的字符串作为特定单元格的值。你可以尝试创建一个Excel ODBC数据源到CSV(我想称为DSN。它在控制面板->管理工具->ODBC数据源中。然后,你可以使用SQL查询它 我仍然不确定你是否能得到你想要的。我的意思是插入一个带有逗号的字符串作为特定单元格的值。a regexp:
'Credits go to http://www.codeguru.com/cpp/cpp/algorithms/strings/article.php/c8153/
r.Pattern = ",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"
它将查找所有不在引号内的逗号
或者,您可以使用我刚刚为vbs改编的这个函数
call test
Function ParseCSV(StringToParse, Quotes)
Dim i, r(), QuotedItemStart, prevpos
ReDim r(0)
prevpos = 1
For i = 1 To Len(StringToParse)
If Mid(StringToParse, i, 1) = "," Then
If QuotedItemStart = 0 Then
r(UBound(r)) = Trim(Mid(StringToParse, prevpos, i - prevpos))
ReDim Preserve r(UBound(r) + 1)
prevpos = i + 1
End If
Else
If InStr(1, Quotes, Mid(StringToParse, i, 1)) Then
If QuotedItemStart Then
r(UBound(r)) = Trim(Mid(StringToParse, QuotedItemStart, i - QuotedItemStart))
ReDim Preserve r(UBound(r) + 1)
QuotedItemStart = 0
prevpos = i + 2
i = i + 1
Else
QuotedItemStart = i + 1
End If
End If
End If
Next
If prevpos < Len(StringToParse) Then r(UBound(r)) = Trim(Mid(StringToParse, prevpos))
ParseCSV = r
End Function
Sub Test()
Dim i, s
s = ParseCSV("""This is, some text!"",25,""Holy holes!"", 286", """")
For i = LBound(s) To UBound(s)
msgbox s(i)
Next
msgbox "Items: " & CStr(UBound(s) - LBound(s) + 1)
End Sub
呼叫测试
函数ParseCSV(StringToParse,引号)
尺寸i,r(),QuotedItemStart,prevpos
雷迪姆r(0)
prevpos=1
对于i=1至Len(StringToParse)
如果Mid(StringToParse,i,1)=“,”则
如果QuotedItemStart=0,则
r(UBound(r))=纵倾(中倾(纵倾、前倾、i-前倾))
重读保留r(UBound(r)+1)
prevpos=i+1
如果结束
其他的
如果InStr(1,引号,中间(StringToParse,i,1))那么
如果是,那么就开始吧
r(UBound(r))=修剪(中间(StringToParse,QuotedItemStart,i-QuotedItemStart))
重读保留r(UBound(r)+1)
QuotedItemStart=0
prevpos=i+2
i=i+1
其他的
QuotedItemStart=i+1
如果结束
如果结束
如果结束
下一个
如果prevpos
A regexp:
'Credits go to http://www.codeguru.com/cpp/cpp/algorithms/strings/article.php/c8153/
r.Pattern = ",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"
它将查找所有不在引号内的逗号
或者,您可以使用我刚刚为vbs改编的这个函数
call test
Function ParseCSV(StringToParse, Quotes)
Dim i, r(), QuotedItemStart, prevpos
ReDim r(0)
prevpos = 1
For i = 1 To Len(StringToParse)
If Mid(StringToParse, i, 1) = "," Then
If QuotedItemStart = 0 Then
r(UBound(r)) = Trim(Mid(StringToParse, prevpos, i - prevpos))
ReDim Preserve r(UBound(r) + 1)
prevpos = i + 1
End If
Else
If InStr(1, Quotes, Mid(StringToParse, i, 1)) Then
If QuotedItemStart Then
r(UBound(r)) = Trim(Mid(StringToParse, QuotedItemStart, i - QuotedItemStart))
ReDim Preserve r(UBound(r) + 1)
QuotedItemStart = 0
prevpos = i + 2
i = i + 1
Else
QuotedItemStart = i + 1
End If
End If
End If
Next
If prevpos < Len(StringToParse) Then r(UBound(r)) = Trim(Mid(StringToParse, prevpos))
ParseCSV = r
End Function
Sub Test()
Dim i, s
s = ParseCSV("""This is, some text!"",25,""Holy holes!"", 286", """")
For i = LBound(s) To UBound(s)
msgbox s(i)
Next
msgbox "Items: " & CStr(UBound(s) - LBound(s) + 1)
End Sub
呼叫测试
函数ParseCSV(StringToParse,引号)
尺寸i,r(),QuotedItemStart,prevpos
雷迪姆r(0)
prevpos=1
对于i=1至Len(StringToParse)
如果Mid(StringToParse,i,1)=“,”则
如果QuotedItemStart=0,则
r(UBound(r))=纵倾(中倾(纵倾、前倾、i-前倾))
重读保留r(UBound(r)+1)
prevpos=i+1
如果结束
其他的
如果InStr(1,引号,中间(StringToParse,i,1))那么
如果是,那么就开始吧
r(UBound(r))=修剪(中间(StringToParse,QuotedItemStart,i-QuotedItemStart))
重读保留r(UBound(r)+1)
QuotedItemStart=0
prevpos=i+2
i=i+1
其他的
QuotedItemStart=i+1
如果结束
如果结束
如果结束
下一个
如果prevpos
VBScript没有可与Perl相比的模块系统。但是,您可以使用打开CSV文件并像访问数据库表一样访问它们。代码如下:
[data.txt]
Format=Delimited(;)
DecimalSymbol=.
ColNameHeader=True
MaxScanRows=0
Col1=Col1Name Long
Col2=Col2Name Long
Col3=Col3Name Text
Col4=Col4Name Text
(这些有趣的评论只是为了修复SO的VB语法错误)
创建一个准确描述输入的文件是最佳选择。如果不这样做,则会强制文本驱动程序猜测,如果它猜错了,则所有赌注都将被取消。schema.ini
必须位于数据所在的同一目录中
我的是这样的:
[data.txt]
Format=Delimited(;)
DecimalSymbol=.
ColNameHeader=True
MaxScanRows=0
Col1=Col1Name Long
Col2=Col2Name Long
Col3=Col3Name Text
Col4=Col4Name Text
使用此data.txt
:
a;b;c;d
1;2;"foo bar";"yadayada"
1;2;"sample data";"blah"
我得到这个输出:
C:\>cscript -nologo data.vbs
4 columns found.
---
1
sample data
C:\>
在这方面值得一读:脱离MSDN。VBScript没有可与Perl媲美的模块系统。但是,您可以使用打开CSV文件并像访问数据库表一样访问它们。代码如下:
[data.txt]
Format=Delimited(;)
DecimalSymbol=.
ColNameHeader=True
MaxScanRows=0
Col1=Col1Name Long
Col2=Col2Name Long
Col3=Col3Name Text
Col4=Col4Name Text
(这些有趣的评论只是为了修复SO的VB语法错误)
创建一个准确描述输入的文件是最佳选择。如果不这样做,则会强制文本驱动程序猜测,如果它猜错了,则所有赌注都将被取消。schema.ini
必须位于数据所在的同一目录中
我的是这样的:
[data.txt]
Format=Delimited(;)
DecimalSymbol=.
ColNameHeader=True
MaxScanRows=0
Col1=Col1Name Long
Col2=Col2Name Long
Col3=Col3Name Text
Col4=Col4Name Text
使用此data.txt
:
a;b;c;d
1;2;"foo bar";"yadayada"
1;2;"sample data";"blah"
我得到这个输出:
C:\>cscript -nologo data.vbs
4 columns found.
---
1
sample data
C:\>
在这方面值得一读:脱离MSDN。为了回答你的另一半问题,我模糊地记得你可以使用分布在多个WSF文件中的Windows脚本主机。我自己从来没有这样做过。不是纯VBS,但如果这是真正的限制,它应该在“just”Windows中工作 更多链接:
- ''
- ''