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

CSV -> textConnection -> R: parsing problems

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 行轧机

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)

quote = 有什么作用?任何帮助都不够有用。

因为他们都遇到了每行末尾的 /n 字符(如 read.csv)或引号 ("") 中的逗号 ',' 被分成多个的问题列 (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 数据文件,行之间用 '\n' 分隔,每个字符列的两端都带有引号。有时,列中有引号

例如。 ""toys" , ""HALLMARK" 贺卡、玩具" , "Toys" , "5" , "1"" \n

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

如何将 regex-cleaned 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", 
)

*我拿了头(file,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", ) 

开始和结束引号有问题,不是所有分隔符都转换为'|'

编辑 2: perl代码问题的解释:

感谢您对这个问题的耐心等待。该代码仅正确替换了 header 行中的分隔符,因为“,”是分隔符。它对前三列为空且只有最后两列有数字的第一行没有任何作用。请参阅:

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

第一行数据的行为如下:

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

第一个分隔符保持不变,第二个分隔符替换为“|”第三个和第四个分隔符也没有动过。

你有办法在代码中包含 /d 吗?类似 ",\d 的东西应该是第二列和第三列之间的分隔符,而 \d,\d 应该是第三列和第四列之间的分隔符,而不会影响数字。我不关心最后一列,仅供参考。

我会使用 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

然后您可以将字段分隔符指定为“||”

@Susan Eraly:

我不得不经历一个艰难的学习阶段,但 PERL 最终发挥了作用。 我下载了 CygWin(windows 的 bash 提示符)和 运行 以下运行良好的脚本:

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

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

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