Есть ли в VBscript модули? Мне нужно справиться с CSV - PullRequest
1 голос
/ 27 марта 2009

Мне нужно прочитать файл CSV, и единственный язык, который я могу использовать, это VBscript.

В настоящее время я просто открываю файл и разделяю его запятыми, и он работает нормально, потому что в полях нет кавычек. Но я знаю, что это невероятно хрупкое решение.

Итак, есть ли такая вещь, как модуль VBscript, который я могу использовать? Где взять проверенное и проверенное регулярное выражение, которое будет разбито только на запятые, а не в кавычки?

Любые предложения с благодарностью приняты.

Ответы [ 4 ]

7 голосов
/ 27 марта 2009

VBScript не имеет модульной системы, сравнимой с Perl. Однако вы можете открыть файлы CSV с помощью ADO и обращаться к ним как к таблице базы данных. Код будет выглядеть примерно так:

(забавные комментарии предназначены исключительно для исправления некорректной подсветки синтаксиса VB в SO)

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

Стоит прочитать по этому поводу: Много ADO о текстовых файлах от MSDN.

0 голосов
/ 30 марта 2009

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

Дополнительные ссылки:

0 голосов
/ 27 марта 2009

Регулярное выражение:

'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 голосов
/ 27 марта 2009

Вы можете попробовать создать источник данных ODBC для Excel в CSV (он называется DSN)

Я все еще не уверен, сможете ли вы получить то, что вы хотите. Я имею в виду вставку строки с запятыми в качестве значения для конкретной ячейки.

...