复制到没有引号

时间:2013-07-05 10:40:39

标签: r export quotes foxpro visual-foxpro

我在dbf文件中有一个大型数据集,并希望将其导出到csv类型文件。 感谢SO已经设法顺利完成。

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

我在视觉foxpro中导出时,我搜索了有关如何处理引号的任何问题,但找不到答案。想要测试this,但是我的电脑发现错误,说明我没有足够的内存来完成我的操作(可能是由于大的数据库)。

任何帮助都将受到高度赞赏。我在从dbf导出到R的时间里遇到了这个问题,我已经搜索了所有我想要的东西并拼命寻找一个简单的解决方案来解决如何将大型dbf导入我的R环境而没有任何错误。

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

  

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

但是根据verbose = T这个函数读取正确的行数(read.csv只导入大约1.5万行)

  

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

3 个答案:

答案 0 :(得分: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,["'],"")

并重复其他字段和表格。

答案 1 :(得分: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)

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

答案 2 :(得分:0)

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