Ускорить read.dbf в R (проблемы с импортом большого файла dbf)

У меня есть набор данных в формате .dbf, и мне нужно импортировать его в R. Ранее я не работал с таким расширением, поэтому понятия не имею, как экспортировать файл dbf с несколькими таблицами в другой формат.

Простой файл read.dbf работает уже несколько часов, а результатов нет. Пробовал искать ускорение производительности R, но не уверен, так ли это, думаю проблема в чтении самого большого dbf файла (вес ~1.5Gb), т.е. сама команда должна быть вообще неэффективной. Однако я не знаю другого варианта, как работать с таким форматом набора данных. Есть ли другой вариант импорта файла dbf?

P.S. (НЕ ВЫПУСК) Источник файла dbf использует визуальный foxpro, но не может экспортировать его в другой формат. Я установил foxpro, но, учитывая, что никогда раньше им не пользовался, я не знаю, как его правильно экспортировать. Пробовал простую команду "Export to type=XLS", но тут возникает проблема с кодировкой, так как большинство переменных в русской кириллице и не могут быть расшифрованы excel. Кроме того, файл dbf содержит несколько таблиц, которые должны быть объединены в 1 большую таблицу, но я не знаю, как экспортировать эти таблицы по отдельности в xls, так же как я не знаю, как экспортировать несколько таблиц целиком в xls. или csv, или как объединить их вместе, так как я абсолютно новичок в теме файлов dbf (хотя уже просмотрел базовые описания)

Любая помощь будет высоко оценена. Не уверен, могу ли я предоставить образец набора данных, так как при просмотре dbf в foxpro есть много столбцов, плюс эти столбцы должны быть объединены с другими таблицами из того же файла dbf, и я понятия не имею, как это сделать. (простите за беспорядок)


person Asayat    schedule 03.07.2013    source источник
comment
Какой пакет вы используете? foreign?   -  person agstudy    schedule 03.07.2013
comment
Может быть проще экспортировать каждую таблицу в csv отдельно, а затем читать их в R. Я не использовал Foxpro, но в меню «Файл» должна быть команда экспорта таблицы или аналогичная.   -  person Hong Ooi    schedule 03.07.2013
comment
еще одна вещь, которую можно попробовать, может быть maptools:::dbf.read, но есть много других вариантов, если вы можете получить свои данные в формате CSV. Я считаю, что data.table::fread очень быстро читает большие CSV-файлы.   -  person Ben    schedule 03.07.2013
comment
Да, б/у иностранное. Пробовал один раз maptools, не помогло. @Hong Ooi, спасибо, удалось экспортировать таблицы вручную, но тут возникает проблема с кодировкой. Кроме того, data.table::fread возвращает исключение Expected sep (','), но поле '' end для большинства экспортируемых файлов.   -  person Asayat    schedule 03.07.2013


Ответы (1)


Вы можете экспортировать из Visual FoxPro во многие форматы, используя команду COPY TO через командное окно, как указано в файле справки VFP.

Например:

use mydbf in 0
select mydbf
copy to myfile.xls type xl5
copy to myfile.csv type delimited

Если у вас есть проблемы, связанные с языком, вы можете добавить в конце пункт «как кодовая страница». Например:

copy to myfile.csv type delimited as codepage 1251

Если вы не знакомы с VFP, я бы попытался вывести необработанные данные таким образом и на платформу, с которой вы знакомы, прежде чем пытаться сливать и т. д.

Чтобы экспортировать их в цикле, вы можете использовать следующее в файле .PRG (изменив две переменные пути вверху, чтобы отразить ваши собственные настройки).

    Close All
Clear All
Clear 

lcDBFDir = "c:\temp\"           && -- Where the DBF files are.
lcOutDir = "c:\temp\export\"        && -- Where you want your exported files to go.

lcDBFDir = Addbs(lcDBFDir)      && -- In case you forgot the backslash.
lcOutDir = Addbs(lcOutDir)  

* -- Get the filenames into an array.
lnFiles = ADir(laFiles, Addbs(lcDBFDir) + "*.DBF")

* -- Process them. 
For x = 1 to lnFiles

    lcThisDBF = lcDBFDir + laFiles[x, 1]
    Use (lcThisDBF) In 0 Alias currentfile
    Select currentfile
    Copy To (lcOutDir + Juststem(lcThisDBF) + ".csv") type csv
    Use in Select("Currentfile")        && -- Close it.

EndFor

Close All

... и запустите его из командного окна - выполните myprg.prg или что-то еще.

person Alan B    schedule 03.07.2013
comment
+1!Может быть, вам следует упомянуть, как/где она может запускать эти команды. (В программах, я думаю..) - person agstudy; 03.07.2013
comment
Большое тебе спасибо! Есть ли варианты получить список всех таблиц, содержащихся в dbf? И экспортировать их все в цикле? :) - person Asayat; 03.07.2013
comment
Номенклатура здесь немного отличается от того, что вы можете предположить, исходя из серверов баз данных, таких как MSSQL, PostGres и т. д. - файлы DBF являются дискретными таблицами. Они могут принадлежать или не принадлежать контейнеру базы данных, который является «базой данных» (имеет расширение .DBC). Если они это сделают, вы можете открыть контейнер базы данных с помощью OPEN DATABASE, а затем LIST TABLES TO mylist.txt. - person Alan B; 03.07.2013
comment
Вы должны запустить команду копирования в команды или почти любую другую команду в командном окне. - person Alan B; 03.07.2013
comment
Вау, спасибо! Насколько я понял, этот код читает все файлы dbf в указанной папке (что мне тоже нужно, так как есть несколько подобных файлов). Просто круто! Но мне также нужно экспортировать все таблицы в этот один файл dbf, так как 1 файл содержит несколько таблиц. Существует 1 большая таблица, в которой около 100 столбцов, в которых закодированы переменные, и около 100 других таблиц с объяснением этих кодов (поэтому мне нужно объединить их в окончательной версии, чтобы иметь «читаемый» набор данных). Теперь я могу сделать это только вручную, выбрав File->Export (как указал @Hong Ooi) - person Asayat; 03.07.2013
comment
Как я уже сказал, файлы DBF представляют собой дискретные таблицы. В них нет других таблиц. - person Alan B; 03.07.2013
comment
Извините, только сейчас понял! (раньше не пользовался foxpro, извините) Еще раз большое спасибо!!! - person Asayat; 03.07.2013