R语言:阅读非标准csv

时间:2014-07-15 16:19:04

标签: r csv

我的csv文件如下所示(如果在Excel中打开):

1     "A long string describing following data"
2     id      name      sex
3     14      Jeff       M
4     17      Mary       F
...
1430  "Another long string describing following data"
1431  4729    John       M
1432  5870    Tina       F
...

我希望将这些数据读入R而不用那些描述行(有很多这样的行,我不能手动完成),我该怎么做?

我试过read.csv,但它说:

Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  more columns than column names

2 个答案:

答案 0 :(得分:3)

一种选择是使用count.fields只读取包含4个项目的那些行,或者排除那些具有指定数量项目的行,例如,

# make a temporary test file
text <- '1     "A long name describing following data"
2     id      name      sex
3     14      Jeff       M
4     17      Mary       F
1430  "Another long name"
1431  4729    John       M
1432  5870    Tina       F'
temp.path <- tempfile()
write(text, temp.path)

# read data
read.table(text=readLines(temp.path)[count.fields(temp.path) == 4], header=TRUE)
#     X2   id name sex
# 1    3   14 Jeff   M
# 2    4   17 Mary   F
# 3 1431 4729 John   M
# 4 1432 5870 Tina   F

# remove tempfile
unlink(temp.path)

答案 1 :(得分:1)

要详细说明我的评论(但未以list身份阅读),请将文件另存为CSV。我假设第一组数字实际上只是某种形式的行号,而不是实际数据的一部分。

x <- tempfile() ## We'll pretend this is your actual CSV file

cat("A long name describing following data",
"id      name      sex",
"14      Jeff       M",
"17      Mary       F",
"Another long name describing following data",
"4729    John       M",
"5870    Tina       F", sep = "\n", file = x)

您可以使用[a-zA-Z]搜索以字符类grep开头的所有行。 grep可以选择反转结果并显示值而不是位置。这两个对read.table

都很有用
read.table(text = grep("^[a-zA-Z]", readLines(x), 
                       value = TRUE, invert = TRUE), 
           header = FALSE)
#     V1   V2 V3
# 1   14 Jeff  M
# 2   17 Mary  F
# 3 4729 John  M
# 4 5870 Tina  F

以后可以轻松添加names列。