2015-04-27 2 views
3

Моя проблема в том, что у меня есть CSV-данные в следующем формате:Читайте CSV с точкой с запятой данных с запятой в качестве десятичного знака в MATLAB

1,000333e+003;6,620171e+001 
1,001297e+003;6,519699e+001 
1,002261e+003;6,444984e+001 

Я хочу, чтобы прочитать данные в MATLAB, но csvread требует, чтобы он был разделен запятой, и я не смог найти решение для запятой-десятичной метки. Думаю, я могу использовать textscan в некотором роде?

Прошу прощения за такой вопрос (я думаю), но я надеюсь, что кто-то может помочь. Ни один из других вопросов/ответов здесь, похоже, не имеет отношения к этой комбинации запятой и точкой с запятой.

+0

Если «импорт данных ", попробуйте' importdata' как функцию. Я также думаю, что это может зависеть от вашего языка. например если вы выполняете 'str2num ('1,000333e + 003')' в командной строке, правильно ли он преобразуется ?. – nkjt

ответ

5

EDIT3 (ПРИНЯТОЙ ОТВЕТ): Используя кнопку импорта данных в разделе переменных на домашней панели инструментов, вы можете настроить способ импорта данных. как только это будет сделано, вы можете щелкнуть выбор импорта под стрелкой и создать сценарий или функцию, которая будет следовать тем же правилам, которые указаны в окне данных импорта.

import Data Instructions

----------------------------------------- --------- сохранен для справки ------------------------------------ --------------

Вы можете использовать dlmread он работает в следующем формате

M = dlmread(filename,';')

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

EDIT1: вместо textscan, следующий код должен сделать трюк или, по крайней мере, большую часть его.

%rt is permission r for read t for open in text mode 
csv_file = fopen('D:\Dev\MATLAB\stackoverflow_tests\1.csv','rt'); 

%the formatspec represents what the scan is 'looking'for. 
formatSpec = '%s%s'; 

%textscan inputs work in pairs so your scanning the file using the format 
%defined above and with a semicolon delimeter 
C = textscan(csv_file, formatSpec, 'Delimiter', ';'); 

fclose(csv_file); 

Результат показан.

C{1}{1} = 
1,000333e+003 
C{1}{2} = 
1,001297e+003 
C{1}{3} = 
1,002261e+003 
C{2}{1} = 
6,620171e+001 
C{2}{2} = 
6,519699e+001 
C{2}{3} = 
6,444984e+001 

EDIT2: заменить запятую с точкой и преобразовать в целое число типа двойной:

[row, col] = size(C); 
for kk = 1 : col 
    A = C{1,kk}; 
    converted_data{1,kk} = str2double(strrep(A, ',', '.')); 
end 

celldisp(converted_data) 

результат:

converted_data{1} = 
    1.0e+03 * 
    1.0003 
    1.0013 
    1.0023 
converted_data{2} = 
    66.2017 
    65.1970 
    64.4498 
+0

К сожалению, при этом мне сказали «Несоответствие между файлом и строкой формата». Чтение неисправностей «Числовое» поле из файла (строка № 1, поле № 2) ==>, 000333e + 003; 6,620171e + 001 \ n " –

+0

Вы пытались использовать кнопку импорта данных на вкладке дома? или импорт должен быть в коде? вы можете выбрать тип деминера в gui – bilaly

+0

Кнопка импорта данных работает (она распознает запятую и точку с запятой), но я бы предпочел, чтобы она была в коде/редакторе, так как у меня есть довольно много файлов. –

0
% Data is in C:\temp\myfile.csv 

fid = fopen('C:\temp\myfile.csv'); 
data = textscan(fid, '%s%s', 'delimiter', ';'); 
fclose(fid); 

% Convert ',' to '.' 
data = cellfun(@(x) str2double(strrep(x, ',', '.')), data, 'uniformoutput', false); 


data = 

    [3x1 double] [3x1 double] 

data{1} 

ans = 

    1.0e+03 * 

    1.000333000000000 
    1.001297000000000 
    1.002261000000000 


data{2} 

ans = 

    66.201710000000006 
    65.196990000000000 
    64.449839999999995 
Смежные вопросы