2009-03-27 32 views
1

私はCSVファイルを読む必要があり、使用できる唯一の言語はVBscriptです。VBscriptにはモジュールがありますか?私はCSVを処理する必要があります

私は現在、ファイルを開き、カンマで区切っています。フィールドには引用符付きカンマがないため、問題なく動作しています。しかし、私はこれが信じられないほど壊れやすい解決法であることを認識しています。

私は使用できるVBscriptモジュールのようなものがありますか?引用符で囲まれていないカンマで区切られた試したとテストされた正規表現を取得する場所はどこですか?

感謝の意を表します。

+0

おかげで、みんな。私は月曜日に仕事に戻るときにそれらをテストします。 – AmbroseChapel

答えて

7

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

(面白いコメントは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は、データが格納されているのと同じディレクトリに存在する必要があります。

鉱山はこのように見えた:私はこの出力を得る

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:\> 

:オフMuch ADO About Text Files

[data.txt] 
Format=Delimited(;) 
DecimalSymbol=. 
ColNameHeader=True 
MaxScanRows=0 
Col1=Col1Name Long 
Col2=Col2Name Long 
Col3=Col3Name Text 
Col4=Col4Name Text 

このdata.txtとMSDN。

+0

私はこのスクリプトを実行しようとしており、Wscriptオブジェクトがないと不平を言っています。私は何が欠けていますか? – AmbroseChapel

+0

これはVB環境から実行しようとしていませんか?これはVBではなくVBScriptです。 – Tomalak

0

あなたは私が考えるDSNと呼ばれる(CSVへのExcel ODBCデータソースを作成しようとすることができコントロールパネルのその - > [管理ツール] - > [ODBCデータソースその後に、あなたはSQLを使用して照会することができ

私は特定のセルの値として、その中にカンマで文字列を挿入する意味はまだあなたが欲しいものを手に入れることができるかどうかわからないよ

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 
0

質問の残りの半分に答えるために、いくつかのWSFファイルにまたがってWindows Script Hostを使用できるという曖昧な想いがあります。私は自分でそれをやったことがありません、link to MSDN。純粋なVBSではありませんが、実際の制約であれば、 'ちょうど'のウィンドウでうまくいくはずです。

その他のリンク:回答を

関連する問題