CSV - > textConnection - > R:解析问题

时间:2015-02-19 07:06:40

标签: regex r parsing csv import

我已经在寻找我的问题的答案超过3周了。

我请你不要偏离讨论。

问题: 我有一个csv文件,我需要读入R进行进一步分析。

我尝试了以下方法,并且都提供了不同的行数: read.csv - 输出1.7毫米行

data <- read.csv("C:/Users/kavindra.mishra/Desktop/~/RelatedKW.csv",header=T,nrow=-1,strip.white=TRUE,na.strings= c("   "," ", ""))

read.table - 输出180 mill

qdata <- read.table("RelatedKW.csv",
                header = T, sep = ",", 
                #quote = "\"",
                #numerals = c("allow.loss"),
                row.names = NULL, 
                col.names = c("Keyword","Product","Subcat","Visits","Order"),
                na.strings = c("   "," ", ""), 
                stringsAsFactors = FALSE,
                colClasses = c("character","character","character", "numeric", "numeric"),
                #nrows = 1000,
                skip = 1, check.names = TRUE, 
                fill = TRUE, 
                strip.white = TRUE, blank.lines.skip = TRUE,
                comment.char = "",
                allowEscapes = TRUE, flush = FALSE,
                skipNul = TRUE)

报价=做什么?没有任何帮助足够有用。

由于他们两个都遇到了每行末尾的/ n字符(如read.csv中)或逗号&#39;,&#39;在引号(&#34;&#34;)被分成多列(read.table)之后,我尝试将数据作为文本连接读取。

fileName <- "RelatedKW.csv"
con <- file(fileName,open="r")
line <- readLines(con)
close(con)


line <- gsub("\\n"," \\n ",line)
line <- gsub(" \\n +"," \\n ",line)

line <- gsub('[/\"]{2}',"",line)
line <- gsub('", $',",",line)

line <- gsub('[/\"]','"',line)
line <- gsub('[/\]','',line)

line <- gsub("^\"","",line)

我尝试使用正则表达式清理数据。但我不知道如何将其读入R数据帧!

我最后的问题:

如何读取csv数据文件,每行两端都有引号,行由&#39; \ n&#39;以及两端带引号的每个字符列。有时,列中的引号

例如。 &#34;&#34;玩具&#34; ,&#34;&#34; HALLMARK&#34;贺卡,玩具&#34; ,&#34;玩具&#34; ,&#34; 5&#34; ,&#34; 1&#34;&#34; \ n

将是包含所有问题的一行数据。

如何将正则表达式清理的textConnection中的数据读入R?正则表达式后的输出文件如下所示:

c("\"Search Keyword (evar66)\",\"Deal Name\",\"Parent_Sub_Category\",\"Visits\",\"Orders\"", 
",,,23473934,50065", ",\"1.50CTW GE, B& WD.925 SSR\",\"Rings\",2,0", 
)

*我拿了头(文件,n = 2)

请尝试了解我无法共享数据。如果你能告诉我如何只保留每一列中的第一个字符并丢弃其余的单词等(以掩盖数据),我可以发送一个片段。

编辑: 使用perl脚本的解决方案执行以下操作

代码:

cat RelatedKW.csv | perl -pe 's/(^"\s*"|"\s*"\s*\\n$)//g' | perl -pe 's/"\s*,\s*\"/|/g' > newRelatedKW.csv

代码前的数据:

c("\"Search Keyword (evar66)\",\"Deal Name\",\"Parent_Sub_Category\",\"Visits\",\"Orders\"", 
",,,23473934,50065", ",\"1.50CTW GE, B& WD.925 SSR\",\"Rings\",2,0", 
)

编辑后的数据:

c("\"Search Keyword (evar66)|Deal Name|Parent_Sub_Category|Visits|Orders\"", ",,,23473934,50065", ",\"1.50CTW GE, B& WD .925 SSR|R\",2,0", ) 

引号的开头和结尾都有问题,并非所有分隔符都转换为&#39; |&#39;

编辑2: 使用perl代码解释问题:

感谢您对此问题的耐心等待。代码只能正确替换标题行中的分隔符,因为&#34;,&#34;是分隔符。它没有对前三行为空的第一行做任何事情,只有最后两列有数字..请参阅:

c("\"Search Keyword (evar66)|Deal Name|Parent_Sub_Category|Visits|Orders\"",     ",,,23473934,50065",) 

此外,第一个真正的数据行的行为如下:

",\"1.50CTW GE, B& WD .925 SSR|R\",2,0", 

第一个分隔符未被触及,第二个分隔符被&#39; |&#39;取代。并且第3和第4个分隔符也不受影响。

您是否有方法将/ d包含在代码中?类似的东西&#34;,\ d应该是第2列和第3列之间的分隔符和\ d,\ d介于第3和第4列之间而不会打扰数字。我不在乎最后一栏,仅供参考。

2 个答案:

答案 0 :(得分:0)

我会用perl来清理你的csv。这是我做的:

cat yourfile.csv | perl -pe 's/(^"\s*"|"\s*"\s*\\n$)//g' | perl -pe 's/"\s*,\s*\"/||/g'

这样做是为了摆脱作为字段分隔符的引号和最后的\ n,并将字段分隔符转换为||。

实施例。 /tmp/a.csv的内容是:

""toys" , ""HALLMARK" greeting cards, toys" , "Toys" , "5" , "1"" \n
""Atoys" , ""AHALLMARK" greeting cards, toys" , "AToys" , "50" , "100"" \n

在命令行上运行perl会给出:

cat /tmp/a.csv | perl -pe 's/(^"\s*"|"\s*"\s*\\n$)//g' | perl -pe 's/"\s*,\s*\"/||/g'

toys||"HALLMARK" greeting cards, toys||Toys||5||1 
Atoys||"AHALLMARK" greeting cards, toys||AToys||50||100

然后你可以将fieldseparator作为“||”

答案 1 :(得分:0)

@Susan Eraly:

我不得不经历一个陡峭的学习阶段,但PERL最终会起作用。 我下载了CygWin(Windows的bash提示符)并运行了以下可以很好地运行的脚本:

$ cat yourfile.csv | perl -pe&#39; s /(^,&#34; |&#34; \ s *&#34; |&#34; \ s *&#34; \ s * \ n $)// g& #39; | perl -pe&#34; \ s *,\ s * \&#34; / | / g&#39; | perl -pe&#39; s / ^,&#34; | ,, |,(\ d)/ | $ 1 / g&#39; &GT; newyourfile.csv

它替换了所有让R和Delimit混淆正确解析文件的分隔符。

再次感谢大家!干杯。 :)