2015-08-15 3 views
1

У меня есть текстовый файл, который содержит числа, разделенные запятой, а также пробел. Фактически это файл, который в каждой строке содержит индекс строки и пары чисел, так что пары разделяются пробелом и номера каждой пары разделяются запятой. Количество столбцов в каждой строке отличается. Например две строки файла, как показано ниже:Чтение номеров, разделенных запятыми и пробелами из текстового файла

1 34,10 12,23 
2 22,123 11,102 12,34 22,232 

Я попытался dlmread, но он дает ошибку, так как есть запятые в файле. Я попробовал csvread, но он читает только некоторые данные и в нечетком шаблоне. Я также использовал:

mymatrix = load('filename.txt','-ascii')

, но он дает ошибку, потому что число столбцов не совпадает в каждой строке.

Как я могу прочитать этот неправильный шаблон данных?

+0

Вы пробовали 'importdata'? Попробуйте также Importdata-Gui. – thewaywewalk

+0

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

+0

, если каждая строка имеет разную длину, то это по-прежнему лучший вариант. Теперь вам нужно зациклировать на нем 'textscan' или' regexp', чтобы получить ваши номера. – thewaywewalk

ответ

0

importdata GUI является действительно мощным инструментом:

enter image description here

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

Хорошая вещь, это интуитивно: входной файл, изменять некоторые параметры, и, наконец, сгенерировать скрипт автоматически («Кнопка Import Selection»):

enter image description here

И вы получите хороший двойной матрица:

data = 

    1 34 10 12 23 NaN NaN NaN NaN 
    2 22 123 11 102 12 34 22 232 

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


Это код, генерируемый GUI:

filename = 'data.txt'; 

formatSpec = '%f%f%f%f%f%f%f%f%f%[^\n\r]'; 
fileID = fopen(filename,'r'); 
data = textscan(fileID, formatSpec, 'Delimiter', {',',' '}, ... 
       'MultipleDelimsAsOne', true, 'EmptyValue' ,NaN, 'ReturnOnError', false); 
out = [data{1:end-1}]; 
+0

Спасибо. Это сработало. – Cror2014

0

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

fgetl возвращает char строку, которую затем можно преобразовать к array числа с помощью str2num

Поскольку каждый массив может иметь различную длину, вы можете присвоить массив к cellarray, в котором, чтобы собрать все данные ,

% Open input file 
fid=fopen('tmp_in.txt'); 
% Initialize output 
the_data=[]; 
% Read the input file 
while 1 
    tline = fgetl(fid); 
    if(~ischar(tline)) 
     break 
    end 
% Convert to number and store in a cellarray 
    the_data=cat(1,the_data,{str2num(tline)}) 
end 
% Close the input file 
fclose(fid); 

Надеюсь, это поможет.

+0

Спасибо, я попробовал метод первого ответа, и он сработал; позже, после того, как я закончу домашнее задание, я также попробую ваш метод. – Cror2014

0

Поскольку длина строк нерегулярна, я не верю, что есть простое решение. Но вот стратегия, которая должна работать.

  1. Итерации по каждой строке в файле. fgetl будет работать.
  2. Для каждой строки сделать nPair = length(strfind(myLine, ','));
  3. formatSpec = ['%d', repmat(' %d,%d', [nPair, 1])]
  4. rowNums = textscan(myLine, formatSpec);

  5. rowNums теперь имеет номер строки как массив ячеек.

Удачи вам!

+0

Спасибо, я попробовал метод первого ответа, и он сработал; позже, после того, как я закончу домашнее задание, я также попробую ваш метод. – Cror2014

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