2016-03-10 5 views
2

Я пытаюсь преобразовать первенствовать файлы в DBF (dBASEIII) с помощью питона и мой текущий процесс:Преобразование .csv в .DBF (dBASEIII) VFP 6.0, все становится памятка поле

  1. Использование xlrd для преобразования первенствовать файл в формате CSV
  2. Я беру заголовки прочь .csv и я использую
  3. Возьмите новоиспеченный .csv и использовать модуль DBF (https://pypi.python.org/pypi/dbf) для преобразования в DBF

I удалите заголовки из c св-файл и я бег следующего:

table = dbf.from_csv(origfname, filename='test.dbf', field_names=headers, dbf_type='db3') 

В настоящее время, когда процесс закончится все поля становятся мемо полями, как я делаю их в Чаре, дату, номер, и т.д. ... поле?

ответ

1

Метод from_csv предназначен только для сброса в поля Memo.

Если вы хотите больше контроля, то вы должны пропустить csv шаг и перейти от xls к dbf, используя xlrd и dbf.

Это займет немного больше работы. Сначала вам нужно создать таблицу с соответствующими полями, но тогда просто выполнить итерацию по таблице xls и запись в таблицу dbf.

Так что-то вроде этого:

some_table = Dbf.Table(
     'whatever.dbf', 
     'name C(25); age N(3); history M', 
     codepage='cp1252', 
     ) 

# get data from xlrd (specifics are not correct, psuedo-code only) 
... 
data = [] 
for row in sheet: 
    for cell in row: 
     data.append(cell.value) 
    # back to real code 
    some_table.append(tuple(data)) 
# all data has been transferred 
some_table.close() 

Чтобы автоматически генерировать имена полей и типы столбцов, Вы должны были бы перебрать первые несколько строк таблицы, чтобы получить имена заголовков и типы значений. Вот ряд примеров данных я итерация:

<type 'unicode'> u'PROD' 
<type 'unicode'> u'cclark' 
<type 'float'> 4.0 
<type 'float'> 99.0 
<type 'unicode'> u'501302' 
<type 'unicode'> u'244026' 
<type 'int'> 1 
<type 'float'> 42444.0 
<type 'str'> '' 
<type 'unicode'> u'AB' 
+0

Я полагаю, последующий вопрос заключается в том, что, когда я использую Excel 2003 для преобразования не должны определить ширину столбца. Знаете ли вы, что соглашение Excel использует для определения соответствующей ширины для его установки? –

+0

@JonNgo: «width» в Excel является визуальным, а не ограничением хранимых данных. Если ваша проблема заключается в правильном хранении полей 'float', вы можете использовать тип' vfp' (по умолчанию используется версия '3'), которая позволит вам указать тип' B' (double-precision float). Используйте 'dbf_type = 'vfp'' при создании таблицы. –

+0

Я немного смущен тем, что вы имеете в виду, извините, не эксперт FoxPro. Поэтому я попытаюсь объяснить, что я имею в виду снова. Когда я сохраняю .xls в .dbf (dBaseIII) в Excel и открываю последующий dbf в FoxPro, когда мне modi stru, каждому столбцу будет присвоен тип (Num, Char, Date и т. Д.) И произвольный ширина. Я предполагаю, что я имею в виду, я хотел бы, чтобы моя программа python была примерно такой же, как Excel 2003 конвертировал .xls в .dbf (dBaseIII) –