Чтение больших CSV-файлов со строками, содержащими запятые в одном поле - PullRequest
3 голосов
/ 31 января 2010

У меня есть большой .csv файл (~ 26000 строк). Я хочу быть в состоянии прочитать это в Matlab. Другая проблема состоит в том, что он содержит коллекцию строк, разделенных запятыми в одном полей.

У меня проблемы с чтением. Я пробовал такие вещи, как tdfread, который здесь не сработает. Какие уловки с текстами я должен знать?

Есть ли другой способ?

Ответы [ 6 ]

2 голосов
/ 31 января 2010

Я не уверен, что генерирует ваш CSV-файл, но это ваша проблема.

Смысл файла CSV в том, что сам файл обозначает разделение полей. Если текст CSV содержит запятые, то ничего, что вы можете сделать, вам не поможет. Как ЛЮБАЯ программа узнает, когда текст в одном поле содержит запятые или когда эта запятая является разделителем полей?

Правильный CSV будет иметь текстовый квалификатор. Некоторые генераторы / читатели дают вам возможность использовать один. Стандартным квалификатором текста является "(цитата). Однако он может быть изменен, потому что ваш текст может содержать их тоже.

Опять-таки, все о генерации правильного контента CSV.

1 голос
/ 01 февраля 2010

Существует вероятность того, что xlsread не даст вам ожидаемого ответа - всегда ли строки отображаются в одних и тех же столбцах, например? Я думаю (как и все остальные :-), что было бы более надежным просто использовать

fid = fopen('yourfile.csv');

и затем любой текст может

t = textscan(fid, '%s', delimiter', sprintf('\n'));
t = t{1};

или просто fgetl (пример в справке идеален).

После этого вы можете выполнять некоторую построчную обработку - например, снова использовать текстовое сканирование для текстового содержимого каждой строки, это хороший и быстрый способ получить массив ячеек, который позволит быстро анализировать каждый линия.

0 голосов
/ 29 марта 2013

Одно простое решение:

path='C:\folder1\folder2\';
data = 'data.csv';
data = dataset('xlsfile',sprintf('%s\%s', path,data));

Конечно, вы также можете сделать следующее:

[data,path] = uigetfile('C:\folder1\folder2\*.csv');
data = dataset('xlsfile',sprintf('%s\%s', path,data));

теперь вы загрузите данные в виде набора данных. Например, простой способ получить столбец 1 -

двойные (данные (1))

0 голосов
/ 06 февраля 2010

Вы используете систему Unix? Причина, по которой я спрашиваю, состоит в том, что вы можете использовать функцию командной строки, такую ​​как sed и регулярные выражения, для очистки этих файлов данных перед их передачей в Matlab. Вот ссылка , которая объясняет, как делать именно то, что вы ищете.

0 голосов
/ 31 января 2010

Поскольку, как уже отмечали другие, ваш файл представляет собой CSV с запятыми внутри того, что вы считаете единым полем, будет трудно убедить Матлаба в том, что это действительно только одно поле. Я думаю, что ваша лучшая стратегия состоит в том, чтобы читать по одной строке за раз, в строку, выполняющую роль буфера, и преобразовывать ее, поле за полем, в переменные или другие структуры данных, которые вы хотите. Поскольку в Matlab встроены возможности регулярных выражений, это не должно быть слишком сложно.

И, как уже предлагали другие, размещение образца ваших данных поможет нам помочь вам.

0 голосов
/ 31 января 2010

У вас есть проблема, потому что вы читаете ее как .csv, и у вас есть запятые в ваших данных. Вы можете получить его в Excel и манипулировать датой, возможно извлекать ненужные запятые с помощью формул Excel. Я работаю с CSV-файлами для импорта БД. Я полагаю, что у matLab есть похожие правила, а в ваших данных нет запятых.

Можете ли вы рассказать нам больше о ваших данных? Есть ли запятые везде, наша единственная колонка? Может быть, вы можете прочитать его как разделитель табуляции?

...