Копировать без кавычек

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

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

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

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

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

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

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

Счетчик eol после первой строки данных: 2811729 Вычитается 1 из последнего eol и всех завершающих пустых строк, остается 2811728 строк данных


person Asayat    schedule 05.07.2013    source источник


Ответы (3)


Возможно, вам придется написать код для экспорта, а не просто использовать команду 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)

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

person LAK    schedule 05.07.2013
comment
Спасибо! Еще вопрос, можно ли все столбцы зациклить? - person Asayat; 09.07.2013
comment
Да, используя функцию AFIELDS(). Я расскажу об этом позже, после встречи. - person LAK; 09.07.2013
comment
Хорошо, добавлено зацикливание столбцов. - person LAK; 09.07.2013

При экспорте в TYPE 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,["'],"")

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

person Alan B    schedule 05.07.2013
comment
... и при импорте этого нового файла в R добавьте sep = "|" к вашему вызову read.csv. - person flodel; 05.07.2013
comment
Спасибо, но все еще есть проблемы на стороне импорта. Я сделал это в первую очередь, используя with _ with character ;. Но я неправильно понял роль персонажа, так что большое спасибо за объяснение! Что касается R, то при импорте с помощью read.csv в этом случае должно быть sep=@, так как sep=| даст только один столбец. Другими словами, символ @ относится к sep=@ в R, но понятия не имею, как R может интерпретировать | разделитель между столбцами. Пробовал использовать с | с символом @ и sep=@, quote=| в сторону R, но в итоге это дало мне еще меньше строк о_О - person Asayat; 05.07.2013
comment
В последнем примере | является разделителем, @ является разделителем. - person Alan B; 05.07.2013
comment
Все еще не работает, R не может хорошо разобрать. Я должен был упомянуть, что некоторые переменные в foxpro имеют значение NULL, как пустое поле, некоторые просто , плюс есть переменные с кавычками внутри их строкового значения. Итак, моя основная проблема связана с кавычками, так как я могу ссылаться на кавычки как на строку символов, поэтому она будет игнорировать кавычки внутри символов в R, но не знаю, как это изменить в foxpro. Хотя я нашел ответ во второй ссылке, но у моего компьютера недостаточно памяти, чтобы проверить это для всего набора данных. - person Asayat; 05.07.2013

* создать файл с разделителями-запятыми без кавычек вокруг полей символов скопировать в TYPE DELIMITED WITH "" (2 двойные кавычки)

person tevye    schedule 22.11.2014