1

CSV ファイルを読み取る必要がありますが、使用できる言語は VBscript だけです。

現在、ファイルを開いてコンマで分割しているだけですが、フィールドに引用符で囲まれたコンマがないため、正常に機能しています。しかし、これが信じられないほど脆弱なソリューションであることは承知しています。

それで、私が使用できるVBscriptモジュールのようなものはありますか? 引用符で囲まれていないカンマでのみ分割される、試行錯誤された正規表現を取得する場所はありますか?

どんな提案もありがたく受け取った。

4

4 に答える 4

7

VBScript には、Perl に匹敵するモジュール システムがありません。ただし、 ADOでCSV ファイルを開き、データベース テーブルのようにアクセスできます。コードは次のようになります。

(面白いコメントは、SO の壊れた VB 構文の強調表示を修正するためだけのものです)

Dim conn    ''// As ADODB.Connection
Dim rs      ''// As ADODB.RecordSet
Dim connStr ''// As String
Dim dataDir ''// As String

dataDir = "C:\"                         '"
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dataDir & ";Extended Properties=""text"""

Set conn = CreateObject("ADODB.Connection")
conn.Open(connStr)
Set rs = conn.Execute("SELECT * FROM [data.txt]")

''// do something with the recordset
WScript.Echo rs.Fields.Count & " columns found."
WScript.Echo "---"

WScript.Echo rs.Fields("Col1Name").Value
If Not rs.EOF Then
  rs.MoveNext
  WScript.Echo rs.Fields("Col3Name").Value
End If

''// explicitly closing stuff is somewhat optional
''// in this script, but consider it a good habit
rs.Close
conn.Close

Set rs = Nothing
Set conn = Nothing

schema.ini入力を正確に記述したファイルを作成するのが最適です。そうしないと、テキスト ドライバーに推測を強制することになり、間違ったことを推測すると、すべての賭けが無効になります。は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 から離れたテキスト ファイルについての ADO がたくさんあります。

于 2009-03-27T10:27:13.783 に答える
0

CSVへのExcel ODBCデータソースの作成を試すことができます(DSNと呼ばれます。コントロールパネル->管理ツール-> ODBCデータソースにあります。次に、SQLを使用してクエリを実行できます。

あなたが望むものを手に入れることができるかどうか、私はまだ確信が持てません。特定のセルの値として、コンマを含む文字列を挿入することを意味します。

于 2009-03-27T09:56:14.403 に答える
0

正規表現:

'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
于 2009-03-27T10:23:33.900 に答える
0

あなたの質問の残りの半分に答えるために、いくつかの WSF ファイルにまたがる Windows Script Host を使用できるという漠然とした記憶があります。自分でやったことがないので、MSDN にリンクしてください。純粋な VBS ではありませんが、それが実際の制約である場合は、「ただの」ウィンドウで動作するはずです。

その他のリンク:

于 2009-03-30T10:35:04.317 に答える