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 的分隔符。
再次感谢大家!干杯。 :)
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 的分隔符。
再次感谢大家!干杯。 :)