2014-02-17 2 views
3

У меня есть файл CSV. Я хочу, чтобы прочитать файл в R, но использовать только первые 2 запятые, т.е. если есть строка, как это в файле,Как читать csv, но разделяя только первые два разделителя запятой?

1,1000, я, я сделал с вами

В RI это необходимо для строки кадра данных с тремя столбцами, подобными этому

> df <- data.frame("Id"="1","Count" ="1000", "Comment" = "I, am done, with you") 
> df 
    Id Count    Comment 
1 1 1000 I, am done, with you 
+0

я уже достиг этого, читая файл и сливая для тех строк, которые имеют более 3-х элементов в них. Мне интересно, есть ли более элегантное решение для этого. – Avinash

+0

Если он прилагается, вы можете читать «1», «1000», «Я, я закончил, с вами». – Aashu

+0

@Aashu Это не так. – Avinash

ответ

4

Регулярное выражение будет работать.

Например, предположим, что str - это строки, которые вы хотите распознать. Здесь предположим, что ваш файл CSV выглядит

1,1000,I, am done, with you 
2,500, i don't know 

Если вы хотите прочитать из файла, просто вызовите readLines(), чтобы прочитать все строки файла в качестве вектора символов в R, так же, как str.

Техника очень проста. Здесь я использую пакет {stringr} в соответствии с текстом и извлекаю необходимую информацию.

str <- c("1,1000,I, am done, with you", "2,500, i don't know") 

library(stringr) 

# match the strings by pattern integer,integer,anything 
matches <- str_match(str,pattern="(\\d+),(\\d+),\\s*(.+)") 

Здесь я кратко объясняет картину (\\d+),(\\d+),\\s*(.+). \\d представляет символ цифры, \\s представляет символ пробела, . представляет что угодно. + означает один или несколько, * означает отсутствие или некоторые. () группирует шаблоны так, что функция знает, что мы рассматриваем как группу информации.

Если посмотреть на matches, это выглядит как

 [,1]       [,2] [,3] [,4]     
[1,] "1,1000,I, am done, with you" "1" "1000" "I, am done, with you" 
[2,] "2,500, i don't know"   "2" "500" "i don't know"   

Look, str_match функция успешно разделить тексты по узору на матрице. Тогда наша работа состоит только в том, чтобы преобразовать матрицу в кадр данных с правильными типами данных.

df <- data.frame(matches[,-1],stringsAsFactors=F) 
colnames(df) <- c("Id","Count","Comment") 
df <- transform(df,Id=as.integer(Id),Count=as.integer(Count)) 

df наша цель:

Id Count    Comment 
1 1 1000 I, am done, with you 
2 2 1002   i don't know 
+0

Я надеюсь, что есть более прямое решение. –

+0

Я стараюсь избегать последующей обработки после чтения. Я использовал обходной путь, читая весь файл, затем вставляя вместе каждую строку с более чем тремя элементами. – Avinash

+0

Предположим, что ваш файл csv имеет имя 'data.csv', вам нужно только вызвать' readLines ("data.csv") ', чтобы прочитать все строки в качестве символьного вектора в R. Затем будет выполняться регулярное выражение. –

Смежные вопросы