Regex VBscript有模块吗?我需要处理CSV

Regex VBscript有模块吗?我需要处理CSV,regex,vbscript,csv,module,split,Regex,Vbscript,Csv,Module,Split,我需要读取CSV文件,唯一可以使用的语言是VBscript 我目前正在打开文件并用逗号分割,它工作正常,因为字段中没有任何带引号的逗号。但我知道这是一个非常脆弱的解决方案 那么,我可以使用VBscript模块吗?在什么地方可以得到一个经过测试的正则表达式,它只能在逗号上拆分,而不能在引号中拆分 非常感谢您的建议。您可以尝试将Excel ODBC数据源创建为CSV(我想称为DSN)。它位于控制面板->管理工具->ODBC数据源中。然后,您可以使用SQL查询它 我仍然不确定你是否能得到你想要的。我的

我需要读取CSV文件,唯一可以使用的语言是VBscript

我目前正在打开文件并用逗号分割,它工作正常,因为字段中没有任何带引号的逗号。但我知道这是一个非常脆弱的解决方案

那么,我可以使用VBscript模块吗?在什么地方可以得到一个经过测试的正则表达式,它只能在逗号上拆分,而不能在引号中拆分


非常感谢您的建议。

您可以尝试将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中工作

更多链接:

  • ''

为了回答您问题的另一半,我模糊地记得您可以使用分布在多个WSF文件中的Windows脚本主机。我自己从来没有这样做过。不是纯VBS,但如果这是真正的限制,它应该在“just”Windows中工作

更多链接:

  • ''

谢谢大家的回答。我会在周一回去工作时测试它们。谢谢大家的回答。我会在周一回去工作时测试它们。我正在尝试运行如图所示的脚本,它正在抱怨没有Wscript对象。我缺少了什么?你不是在尝试从中运行此脚本吗