использованиеtextcan для чтения плохо отформатированного файла CSV в Octave - PullRequest
1 голос
/ 13 июля 2020

Я пытаюсь прочитать файл CSV в Octave с помощью textscan, но файл CSV не всегда правильно отформатирован. Следующая mcve должна проиллюстрировать проблему:

Допустим, файл выглядит следующим образом:

12/01/2020,12,1,2020,0,0,Russia,RU,RUS,145872260,Europe,0
11/01/2020,11,1,2020,0,0,Russia,RU,RUS,145872260,Europe,0
10/01/2020,10,1,2020,0,0,Russia,RU,RUS,145872260,Europe,0
09/01/2020,9,1,2020,0,0,Russia,RU,RUS,145872260,Europe,0
08/01/2020,8,1,2020,0,0,Russia,RU,RUS,145872260,Europe,0
07/01/2020,7,1,2020,0,0,Russia,RU,RUS,145872260,Europe,
06/01/2020,6,1,2020,0,0,Russia,RU,RUS,145872260,Europe,
05/01/2020,5,1,2020,0,0,Russia,RU,RUS,145872260,Europe,

Вы заметите, что последний 0 отсутствует в последних 3 строках. Очевидно, я могу go и вручную редактировать CSV-файлы в Notepad ++ или подобном, но мы говорим о нескольких десятках тысяч строк для go через, и я просто чувствую, что должно быть лучшее решение.

Мой код будет примерно таким (обратите внимание, что я пробовал использовать %*f для последнего элемента, чтобы сообщить Octave, чтобы он пропустил его, но это, похоже, не работает):

fname = 'mcve.csv'; % the above file
fid = fopen(fname);
csv_data = textscan(fid,'%s %d %d %d %d %d %s %s %s %d %s %*f','Delimiter',',');
fclose(fid);

Если вы затем посмотрите на csv_data, вы увидите, что даты неверны (остальные данные выглядят нормально):

>> csv_data{1}
ans =
{
  [1,1] = 12/01/2020
  [2,1] = 11/01/2020
  [3,1] = 09/01/2020
  [4,1] = 08/01/2020
  [5,1] = 07/01/2020
  [6,1] = /01/2020
  [7,1] = /01/2020
}

Есть идеи, как решить эту проблему или что еще попробовать, кроме %*f Я уже пробовал?

1 Ответ

2 голосов
/ 14 июля 2020

Используйте csv2cell из пакета io.

...