gpt4 book ai didi

r - sqldf、csv 和包含逗号的字段

转载 作者:行者123 更新时间:2023-12-02 22:59:43 26 4
gpt4 key购买 nike

我花了一段时间才弄清楚这一点。所以,我是answering my own question .

您有一些 .csv,您想要加载它 fast ,您想使用sqldf包裹。您常用的代码会被一些烦人的字段所困扰。示例:

1001,     Amy,9:43:00, 99.2
1002,"Ben,Jr",9:43:00, 99.2
1003,"Ben,Sr",9:44:00, 99.3

此代码仅适用于 *nix 系统。

library(sqldf)
system("touch temp.csv")
system("echo '1001, Amy,9:43:00, 99.2\n1002,\"Ben,Jr\",9:43:00, 99.2\n1003,\"Ben,Sr\",9:44:00, 99.3' > temp.csv")

如果尝试阅读

x <- read.csv.sql("temp.csv", header=FALSE)

R 提示

Error in try({ : 
RS-DBI driver: (RS_sqlite_import: ./temp.csv line 2 expected 4 columns of data but found 5)

sqldf -FAQ.13解决方案也不起作用:

x <- read.csv.sql("temp.csv", filter = "tr -d '\"' ", header=FALSE)

R 再次提示

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
line 1 did not have 5 elements

事实上,过滤器仅删除双引号。

那么,如何进行?

最佳答案

Perl 和正则表达式来救援。挖掘 SO,并玩弄正则表达式 here ,想出正确的一个并不难:

 s/(\"[^\",]+),([^\"]+\")/$1_$2/g

匹配 "...,...",这里的点不是双引号和逗号,而是用下划线替换逗号。 Perl 单行过滤器是传递给 sqldf 的正确过滤器:

x <- read.csv.sql("temp.csv", 
filter = "perl -e 's/(\"[^\",]+)_([^\"]+\")/$1_$2/g'",
header=FALSE)

这是数据框x

> x
V1 V2 V3 V4
1 1001 Amy 9:43:00 99.2
2 1002 "Ben_Jr" 9:43:00 99.2
3 1003 "Ben_Sr" 9:44:00 99.3

现在,DYO 弦乐美化......

编辑:上面的正则表达式仅替换字段中第一次出现的逗号。要替换所有发生的情况,请使用此

s{(\"[^\",]+),([^\"]+\")}{$_= $&, s/,/_/g, $_}eg

有什么不同?

  1. 我将分隔符 / 替换为 {}
  2. 最后的选项 e 指示解析器将替换字段解释为 perl 代码;
  3. 替换是一个简单的正则表达式替换,它将匹配的子字符串 $& 中的所有“,”替换为“_”。

一个例子:

system("touch temp.csv")
system("echo '1001, Amy,9:43:00, 99.2\n1002,\"Ben,Jr,More,Commas\",9:43:00, 99.2\n1003,\"Ben,Sr\",9:44:00, 99.3' > temp.csv")

文件 temp.csv 如下所示:

1001,                 Amy,9:43:00, 99.2
1002,"Ben,Jr,More,Commas",9:43:00, 99.2
1003, "Ben,Sr",9:44:00, 99.3

并且可以阅读

x <- read.csv.sql("temp.csv", 
filter = "perl -p -e 's{(\"[^\",]+),([^\"]+\")}{$_= $&, s/,/_/g, $_}eg'",
header=FALSE)
> x
V1 V2 V3 V4
1 1001 Amy 9:43:00 99.2
2 1002 "Ben_Jr_More_Commas" 9:43:00 99.2
3 1003 "Ben_Sr" 9:44:00 99.3

关于r - sqldf、csv 和包含逗号的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8086559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com