【问题标题】:Copy to without quotes复制到不带引号
【发布时间】:2013-07-03 10:38:03
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: r export quotes foxpro visual-foxpro


    【解决方案1】:

    当导出到 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,["'],"")
    

    并重复其他字段和表格。

    【讨论】:

    • ... 并将新文件导入 R 时,将 sep = "|" 添加到您的 read.csv 调用中。
    • 谢谢,但在导入方面仍有问题。我首先使用带有字符“;”的_来完成它。但是我对角色角色有误解,所以非常感谢您的解释!至于R,用read.csv导入时,在这种情况下应该是sep="@",因为sep="|"只会给出一列。所以换句话说,字符“@”指的是R中的sep="@",但不知道R如何解释“|”列之间的分隔符。尝试与“|”一起使用带有字符“@”和 sep="@", quote="|"在 R 端,但最后它给了我更少的行 o_O
    • 在最后一个例子中,“|”是分隔符,“@”是分隔符。
    • 还是不行,R解析不好。我应该提一下,foxpro 中的一些变量像一个空框一样为 NULL,有些只是“”,另外还有一些变量在其字符串值中带有引号。所以我的主要问题是处理引号,因为我可以引用引号作为字符串,所以它会忽略 R 中字符内的引号,但不知道如何在 foxpro 中更改它。我虽然在第二个链接中找到了答案,但是我的计算机没有足够的内存来检查整个数据集
    【解决方案2】:

    您可能必须编写代码来执行导出,而不是简单地使用 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)
    

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

    【讨论】:

    • 谢谢!还有一个问题,是否可以将所有列放在一个循环中?
    • 是的,使用 AFIELDS() 函数。稍后我会在会议结束后对此进行扩展。
    • 好的,添加了一些列循环。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多