2009-03-27 8 views
1

Ich muss eine CSV-Datei lesen, und die einzige Sprache, die ich verwenden kann, ist VBscript.Hat VBscript Module? Ich muss mit CSV umgehen

Ich bin gerade dabei, die Datei zu öffnen und auf Kommas zu teilen, und es funktioniert OK, weil es in Feldern keine zitierten Kommas gibt. Aber mir ist bewusst, dass dies eine unglaublich zerbrechliche Lösung ist.

Also, gibt es so etwas wie ein VBscript-Modul, das ich verwenden kann? Irgendwo, um einen bewährten regulären Ausdruck zu bekommen, der sich nur in Kommas aufteilt, nicht in Anführungszeichen?

Alle Vorschläge dankbar erhalten.

+0

Danke für die Antworten, jeder. Ich werde sie testen, wenn ich am Montag wieder zur Arbeit komme. – AmbroseChapel

Antwort

7

VBScript hat kein mit Perl vergleichbares Modulsystem. Sie können jedoch CSV-Dateien mit ADO öffnen und auf sie wie eine Datenbanktabelle zugreifen. Der Code würde etwa so lauten:

(Die lustigen Kommentare sind ausschließlich SO funktionierte nicht VB Syntax-Hervorhebung zu beheben)

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 

Erstellen eine schema.ini-Datei, die genau beschreibt Ihre Eingabe optimal ist. Wenn Sie dies nicht tun, erzwingen Sie, dass der Texttreiber rät, und alle Wetten sind aus, wenn sie das falsche erraten. Die schema.ini muss sich in demselben Verzeichnis befinden, in dem sich Ihre Daten befinden.

Grube sah wie folgt aus:

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

und mit diesem data.txt:

a;b;c;d 
1;2;"foo bar";"yadayada" 
1;2;"sample data";"blah" 

ich diese Ausgabe:

C:\>cscript -nologo data.vbs 
4 columns found. 
--- 
1 
sample data 

C:\> 

Verdient einen Lese in diesem Zusammenhang: Much ADO About Text Files aus der MSDN.

+0

Ich versuche das Skript wie gezeigt auszuführen und beschwere mich, dass kein Wscript-Objekt vorhanden ist. Was vermisse ich? – AmbroseChapel

+0

Sie versuchen nicht, dies in einer VB-Umgebung auszuführen, oder? Dies ist VBScript, nicht VB. – Tomalak

0

Sie können versuchen, eine Excel-ODBC-Datenquelle in das CSV-Erstellung (Called DSN denke ich sein in Systemsteuerung -.> Verwaltung -.> ODBC-Datenquellen dann auf, können Sie es mithilfe von SQL Abfrage

.

ich bin immer noch nicht sicher, ob Sie bekommen, was Sie wollen, ich meine für eine bestimmte Zelle eine Zeichenfolge mit Kommas in es als Wert Einfügen

0

A regexp:..

'Credits go to http://www.codeguru.com/cpp/cpp/algorithms/strings/article.php/c8153/ 
r.Pattern = ",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))" 

es werden alle Kommata finden, dass sind nicht in Quo tes.

Alternativ können Sie diese Funktion verwenden, die ich gerade für VBS angepasst habe.

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

Um die andere Hälfte Ihrer Frage zu beantworten, habe ich eine vage Erinnerung, dass Sie Windows Script Host über mehrere WSF-Dateien verteilt verwenden können. Ich habe es nie selbst gemacht, link to MSDN. Nicht reines VBS, aber es sollte in "nur" Fenstern funktionieren, wenn das die wirkliche Einschränkung war.

Weitere Links: