1

我在 dbf 文件中有一个大型数据集,并希望将其导出到 csv 类型文件。多亏了SO已经成功地做到了。

但是,当我尝试将其导入 R(我工作的环境)时,它会将一些字符组合在一起,使某些行比它们应有的长得多,从而破坏了整个数据库。最后,每当我导入导出的 csv 文件时,我只得到一半的 db。认为主要问题是字符串字符中的引号,但quote=""在 R 中指定并没有帮助(而且它通常有帮助)。

我已经搜索了有关在视觉 foxpro 中导出时如何处理引号的任何问题,但找不到答案。想对此进行测试,但我的计算机捕获错误,指出我没有足够的内存来完成我的操作(可能是由于数据库很大)。

任何帮助将不胜感激。我在从 dbf 导出到 R 时遇到了这个问题足够长的时间,搜索了我能做的一切,并拼命寻找一个简单的解决方案,如何将大型 dbf 导入我的 R 环境而没有任何错误。

(在 R 中:检查了导入文件是否有问题,实际上大多数列的 nchars 比应有的长得多,而行数减半。用read.csv("file.csv", quote="")-> 读取数据库没有帮助。用data.table::fread()返回错误读取

预期 sep (',') 但 '0' 在第 77980 行结束字段 88:

但根据 verbose=T,此函数读取正确的行数(read.csv 仅导入约 150 万行)

第一个数据行后的 eol 计数:2811729 最后一个 eol 和任何尾随空行减去 1,留下 2811728 个数据行

4

3 回答 3

3

导出到 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 中有三种分隔字符串的方法 - 使用普通的单引号和双引号字符。因此,要从 DBF 文件中的字符字段 myfield1 和 myfield2 中去除引号,您可以在命令行窗口中执行此操作:

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

并重复其他字段和表格。

于 2013-07-05T11:00:29.293 回答
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)

请注意,我使用 [ ] 字符来分隔包含逗号和引号的字符串。这有助于可读性。

于 2013-07-05T13:28:36.657 回答
0

*创建一个逗号分隔的文件,字符字段周围没有引号复制到TYPE DELIMITED WITH“”(2个双引号)

于 2014-11-22T22:47:16.683 回答