2013-07-05 2 views
1

У меня есть большой набор данных в файле dbf и вы хотите экспортировать его в файл типа csv. Благодаря SO уже удалось сделать это плавно.Копирование без котировок

Однако, когда я пытаюсь импортировать его в R (среда, в которой я работаю), он объединяет некоторые символы вместе, делая несколько строк намного дольше, чем они должны быть, следовательно, разбивая всю базу данных. В конце концов, всякий раз, когда я импортирую экспортированный файл csv, я получаю только половину db. Подумайте, основная проблема связана с кавычками в строковых символах, но указание quote="" в R не помогло (и это обычно помогает).

Я ищу любой вопрос о том, как обращаться с кавычками при экспорте в visual foxpro, но не смог найти ответ. Хотелось проверить this, но мой компьютер ловит ошибку, заявив, что у меня недостаточно памяти для завершения моей операции (возможно, из-за большого db).

Любая помощь будет высоко оценена. Я столкнулся с этой проблемой при экспорте из dbf в R достаточно долго, искал все, что мог, и отчаянно искал простое решение о том, как импортировать большую dbf в среду R без каких-либо ошибок.

(В R: Проверено ли проблемы с импортированной file и в самом деле большинство из колонн имеют гораздо более длинные nchars, чем должно быть, в то время как количество строк вдвое Читать БД с read.csv("file.csv", quote="") -> не помогло Читаем с.. data.table::fread() возвращается ошибка

Ожидаемое сентябре (''), но '0' заканчивается поле 88 на линии 77980:

но согласно многословной = T эта функция считывает нужное число строк (read.csv импортирует только около 1,5 млн. строк)

Граф EOL после первой строки данных: 2811729 вычитают 1 для последнего EOL и любых пустых строк, оставляя 2811728 строк данных

ответ

1

Возможно, вам придется написать код для экспорта, а не просто использовать команду COPY TO ... DELIMITED.

SELECT thedbf 
mfld_cnt = AFIELDS(mflds) 

fh = FOPEN(m.filename, 1) 

SCAN 

    FOR aa = 1 TO mfld_cnt 
    mcurfld = 'thedbf.' + mflds[aa, 1] 
    mvalue = &mcurfld 
    ** Or you can use: 
    mvalue = EVAL(mcurfld) 

    ** manipulate the contents of mvalue, possibly based on the field type 
    DO CASE 
     CASE mflds[aa, 2] = 'D' 
     mvalue = DTOC(mvalue) 

     CASE mflds[aa, 2] $ 'CM' 
      ** Replace characters that are giving you problems in R 
      mvalue = STRTRAN(mvalue, ["], '') 

     OTHERWISE 
      ** Etc. 
    ENDCASE 

    = FWRITE(fh, mvalue) 
    IF aa # mfld_cnt 
     = FWRITE(fh, [,]) 
    ENDIF 

    ENDFOR 

    = FWRITE(fh, CHR(13) + CHR(10)) 
ENDSCAN 
= FCLOSE(fh) 

Обратите внимание, что я использую [] символы, чтобы разграничить строки, содержащие запятые и кавычки. Это помогает читаемости.

+0

Спасибо! Еще один вопрос: можно ли поставить все столбцы в цикле? – Asayat

+1

Да, используя функцию AFIELDS(). Я расскажу об этом позже после встречи. – LAK

+0

Хорошо, добавлено несколько циклов. – LAK

3

При экспорте в ТИПЕ DELIMITED Вы имеете некоторый контроль на стороне VFP как к тому, как экспорт форматирует выходной файл.

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

copy to myfile.csv type delimited with "|" 

так, что будет производить что-то вроде:

|A001|,|Company 1 Ltd.|,|"Moorfields"| 

Вы также можете изменить разделитель из запятой другой персонаж:

copy to myfile.csv type delimited with "|" with character "@" 

давая

|A001|@|Company 1 Ltd.|@|"Moorfields"| 

Это может помочь при разборе на стороне R.

Существует три способа разграничения строки в VFP - с использованием обычных одиночных и двойных кавычек.Таким образом, чтобы лишить цитаты из символьных полей myfield1 и myfield2 в файле DBF вы могли бы сделать это в командном окне:

close all 
use myfile 
copy to mybackupfile 
select myfile 
replace all myfield1 with chrtran(myfield1,["'],"") 
replace all myfield2 with chrtran(myfield2,["'],"") 

и повторить для других полей и таблиц.

+1

... и при импорте, что новый файл в R, добавить '= сен" | "' к вашему вызову 'read.csv'. – flodel

+0

Спасибо, но все еще есть проблемы со стороны импорта. Я сделал это, в первую очередь, используя _ с символом «;». Но я неправильно понял роль персонажа, поэтому большое спасибо за объяснение! Что касается R, то при импорте с read.csv в этом случае это должно быть sep = "@", так как sep = "|" даст только один столбец. Иными словами, символ «@» относится к sep = «@» в R, но понятия не имеет, как R может интерпретировать «|» разделитель между столбцами. Пробовал использовать с "|" с символом "@" и sep = "@", quote = "|" в R, но в конце он дал мне еще меньше строк. o_O – Asayat

+0

В последнем примере «|» является разделителем, «@» является разделителем. –

0

* создать файл с разделителями запятыми без кавычек вокруг символьных полей копию TYPE разделённых «» (2 двойные кавычки)

 Смежные вопросы

  • Нет связанных вопросов^_^