2015-04-07 4 views
0

Я работаю над некоторым кодом MATLAB, который анализирует CSV-файл в таблице. Файл CVS имеет семь столбцов, разделенных запятыми, а также содержит тысячи строк.Ломать вывод текстового сканирования MATLAB в таблицу

Сейчас код разборе выглядит следующим образом:

fid = fopen('data.csv', 'r'); 
parsed = textscan(fid, '%s %f %f %f %f %f %f', 'Delimiter',',', 'HeaderLines', 1); 

Но disp(parsed); возвращает объект, который содержит массив, который имеет только один столбец. Эти данные выглядят примерно так:

[209,1] = 3/8/2015 16:12:00 
[210,1] = 8.09 
[211,1] = 952 
[212,1] = 603 
[213,1] = 100.8 
[214,1] = 20.8 
[215,1] = 11.3 
[216,1] = 10.66 
[217,1] = 3/8/2015 16:47:00 
[218,1] = 8.1 
[219,1] = 950 
[220,1] = 604 
[221,1] = 100 
[222,1] = 15.8 
[223,1] = 11.18 
[224,1] = 10.71 
[225,1] = 3/8/2015 17:22:00 
[226,1] = 8.07 
[227,1] = 981 

Как разбить эти данные на таблицу. Я хочу иметь возможность взаимодействовать данными: parsed[1][3]. Я думаю, что я просто пропускаю очевидный параметр, чтобы перейти в функцию textscan(), но я нигде не могу найти документацию.

Любая помощь, которую вы могли бы предоставить, была бы очень признательна!

Update:

Вот небольшой пример файла CSV Я работаю с:

dt,temp,ldo,turbidity,ldo.per,orp,conductivity,ph 
3/8/2015 00:02:00,7.99,11.52,3.8,96.3,612,1038,8.01 
3/8/2015 00:07:00,7.98,11.52,3.5,96.3,612,1038,8.01 
3/8/2015 00:12:00,7.96,11.52,3.4,96.3,612,1038,8.01 
3/8/2015 00:17:00,7.97,11.54,3.7,96.5,612,1038,8.01 

Я хотел бы выход, чтобы посмотреть что-то вроде:

A = 
    3/8/2015 00:02:00 7.99 11.52 3.8 96.3 612 1038 8.01 
    3/8/2015 00:07:00 7.98 11.52 3.5 96.3 612 1038 8.01 
    3/8/2015 00:12:00 7.96 11.52 3.4 96.3 612 1038 8.01 
    3/8/2015 00:17:00 7.97 11.54 3.7 96.5 612 1038 8.01 
+0

Опубликовать небольшой образец файла csv и желаемого вывода –

+0

Я обновил свой ответ, чтобы включить образец ввода и вывода. Спасибо! –

ответ

2

Вы можете использовать importdata:

d = importdata('filename.csv'); 

Это дает-структуру d с полями data (числовыми) и textdata (массив ячеек строк):

>> d.data 
ans = 
    1.0e+003 * 
    0.0080 0.0115 0.0038 0.0963 0.6120 1.0380 0.0080 
    0.0080 0.0115 0.0035 0.0963 0.6120 1.0380 0.0080 
    0.0080 0.0115 0.0034 0.0963 0.6120 1.0380 0.0080 
    0.0080 0.0115 0.0037 0.0965 0.6120 1.0380 0.0080 

>> d.textdata 
ans = 
    'dt'     'temp' 'ldo' 'turbidity' 'ldo.per' 'orp' 'conductivity' 'ph' 
    '3/8/2015 00:02:00' ''  ''  ''    ''   ''  ''    '' 
    '3/8/2015 00:07:00' ''  ''  ''    ''   ''  ''    '' 
    '3/8/2015 00:12:00' ''  ''  ''    ''   ''  ''    '' 
    '3/8/2015 00:17:00' ''  ''  ''    ''   ''  ''    '' 

Чтобы объединить их, то Вам нужен массив ячеек:

result = [d.textdata(2:end,1) num2cell(d.data)]; 

, который дает

result = 
    '3/8/2015 00:02:00' [7.9900] [11.5200] [3.8000] [96.3000] [612] [1038] [8.0100] 
    '3/8/2015 00:07:00' [7.9800] [11.5200] [3.5000] [96.3000] [612] [1038] [8.0100] 
    '3/8/2015 00:12:00' [7.9600] [11.5200] [3.4000] [96.3000] [612] [1038] [8.0100] 
    '3/8/2015 00:17:00' [7.9700] [11.5400] [3.7000] [96.5000] [612] [1038] [8.0100] 
+0

Спасибо за ответ! Мне пришлось немного изменить код, чтобы включить разделитель. Поэтому у меня есть: 'd = importdata ('data.csv', ',', 1);' но '1', похоже, не обрезает заголовок. Когда я запускаю его, я получаю «ошибка: несоответствие горизонтальных размеров (1836x1 против 1736x7)», что имеет смысл, поскольку первая строка «textdata» является заголовком. Как это обойти? –

+0

Я не вижу, как 'd.textdata' может иметь 1836 строк и' d.data' только 1736. Возможно, некоторые из ваших числовых данных не читаются как числа –

+0

Я пропустил это. Это была одна ошибка, но оказалось, что одна строка '3/14/2015 NA, NA, NA, NA, NA, NA, NA, NA' отбрасывала ее, поэтому вы были правы. Как побочный вопрос, есть ли способ учесть это заранее? –