2009-03-27 3 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 должен находиться в том же каталоге, где находятся ваши данные.

Mine выглядел следующим образом:

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

Ценность прочитанный в этом отношении: Much ADO About Text Files выключения MSDN.

+0

Я пытаюсь запустить скрипт, как показано, и он жалуется, что нет объекта Wscript. Что мне не хватает? – AmbroseChapel

+0

Вы не пытаетесь запустить это из среды VB, не так ли? Это VBScript, а не VB. – Tomalak

0

Вы можете попробовать создать в Excel ODBC источника данных в формате CSV (Вызывается DSN я думаю, что его в панели управления. -> Администрирование -.> Источники данных 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

Чтобы ответить на другую половину вашего вопроса, у меня есть смутное воспоминание о том, что вы можете использовать хост Windows Script Host в нескольких файлах WSF. Я никогда не делал этого сам, link to MSDN. Не чистый VBS, но он должен работать в «просто» окнах, если это было реальным ограничением.

Другие ссылки: