Проблема с типом данных при извлечении ADO для CSV - PullRequest
1 голос
/ 29 апреля 2011

Хорошо, возникла проблема с извлечением почтового индекса из файла CSV с помощью ADO. Происходит следующее: если первый набор почтовых индексов имеет длину 5 цифр, то тип данных назначается целым числом для целого свойства поля в наборе записей, что не будет проблемой, если следующие почтовые индексы не будут 9-значными почтовыми индексами. код с тире (99999 против 99999-9999). Когда встречаются эти 9-значные почтовые индексы, поле возвращает ноль. Итак, я могу только предположить, что JET 4 берет небольшую выборку данных (первые 3 записи?) И назначает тип данных этому полю. Я пытался установить тип поля во время выполнения, но не смог, потому что я не знаю, что я делаю, или это вне моего контроля.

Пара достоинств: 1. У меня есть контроль над оператором SQL, который извлекает информацию (который использует предложение group by) 2. У меня есть ограниченный контроль, прежде чем данные извлекаются. 3. Язык выполнения VB6 с использованием ADO.

Любые предложения или указатели?

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Кажется, что наиболее распространенный способ сделать это - использовать файл Schema.ini :

Когда используется драйвер текста, формат текстового файла определяетсяс помощью файла информации схемы.Файл информации о схеме всегда называется Schema.ini и всегда хранится в том же каталоге, что и источник текстовых данных.Файл информации о схеме предоставляет IISAM информацию об общем формате файла, имени столбца и информации о типе данных, а также о некоторых других характеристиках данных.Файл Schema.ini всегда требуется для доступа к данным фиксированной длины.Вам следует использовать файл Schema.ini, когда ваша текстовая таблица содержит данные DateTime, Currency или Decimal, или в любое время, когда вы хотите больше контролировать обработку данных в таблице.

Я установилПример использования следующих файлов:

test.csv :

normal text,12345
some more ordinary words,12345-9876

Schema.ini

[test.csv]
Format=CSVDelimited
ColNameHeader=False
Col1=Dummy Text
Col2=ZipCode Text

test.vbs

Option Explicit

Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim oConn : Set oConn = CreateObject("ADODB.Connection")
Dim rs : Set rs = CreateObject("ADODB.Recordset")

Dim scriptPath : scriptPath = fso.GetParentFolderName(WScript.ScriptFullName)

oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & scriptPath & ";" & _
           "Extended Properties=""text;HDR=NO"""

rs.Open "SELECT * FROM test.csv", oConn

WScript.Echo rs.Fields(0).Name & "|" & rs.Fields(1).Name

Do Until rs.EOF
    WScript.Echo rs.Fields(0).Value & "|" & rs.Fields(1).Value
    rs.MoveNext
Loop

rs.Close
oConn.Close

И вывод выглядит так:

Dummy|ZipCode
normal text|12345
some more ordinary words|12345-9876

Имейте в виду, что файл Schema.ini должен находиться в той же папке, что итекстовый файл и должен ссылаться на текстовый файл по имени ([test.csv] в приведенном выше примере).Возможно, вам придется динамически сгенерировать файл Schema.ini для каждого импортируемого вами файла или скопировать и переименовать файл csv во временную папку.

0 голосов
/ 29 апреля 2011

Да, ADO выполняет приведение типов на основе первой записи. Тире '-' является недопустимым символом в целочисленном типе, поэтому он не будет анализировать их. Вы хотите, чтобы все это было строкой (на самом деле, почтовые индексы - это строки, а не целые числа).

Возможно, стоит подготовить данные. Напишите небольшую программу для чтения CSV и добавьте -0000 к 5-значным записям. Тогда все записи будут состоять из 10 цифр, с -, и следует привести к строке.

...