2015-10-19 2 views
-1

Мне нужно прочитать файл данных ASCII, используя команду MATLAB fscanf. Данные представляют собой плавающие числа с фиксированной длиной поля и точностью. В каждой строке файла данных имеется 10 столбцов числовых значений, а число строк варьируется от одного файла к другому. Ниже приведен пример первой линии: ширинаЧтение файлов с фиксированной длиной поля

0.000 0.000 0.005 0.000 0.010 0.000 0.015 0.000 0.020 -0.000 

Поле 7 и точность 3.

Я попытался:

x = fscanf(fid,'%7.3f\r\n'); 
x = fscanf(fid,[repmat('%7.3f',1,10) '\r\n']); 

но они не возвращают ничего!

Когда я не указываю поле и точность, например x = fscanf(fid,'%f');, он считывает все данные, но синус некоторые данные занимают ровно 7 пробелов (пример 158.000), он соединяет два последовательных числа, что приводит к неправильному выходу. Вот пример:

0.999158.000 

читает это как 0.999158 и .000

Любой намек или помощь будет высоко оценена.

+1

Как вы получите '0.999158.000' из' 0.000 0.000 0,005 0,000 0,010 0,000 0,015 0,000 0,020 -0,000'? – IKavanagh

+0

Также, что вы подразумеваете под шириной поля, является '7', а точность -' 3' в '0.000 0.000 0.005 0.000 0.010 0.000 0.015 0.000 0.020 -0.000'?Ни одно из этих значений не имеет ширины поля '7' для меня. – IKavanagh

ответ

2

Если ваши данные не могут быть разделены пробелом (0.999158.000 в примере, который вы задали в вопросе), вы можете попробовать использовать textscan, чтобы прочитать файл.

Обратите внимание, что в этом формате вы не можете вводить такие данные, как -158.000.

Тем не менее, с этим форматом, вы не можете иметь такие значения, как -158,000 Так как textscan Возвращает cellarray вам, возможно, потребуется преобразовать cellarray в матрицу (если вам не нравится работать с cellarray).

fp=fopen('input_file_5.txt') 
x = textscan(fp,repmat('%7.3f',1,10)) 
fclose(fp) 
m=[x{:}] 

входного файл

0.999130.000 0.005 0.000 0.010 0.000 0.015 0.000 0.020 -0.000 
    0.369-30.000123.005 0.000 0.040 0.000 0.315 0.000 0.020-10.000 

Выхода

m = 

Columns 1 through 8 

0.9990 130.0000 0.0050   0 0.0100   0 0.0150   0 
0.3690 -30.0000 123.0050   0 0.0400   0 0.3150   0 

Columns 9 through 10 

0.0200   0 
0.0200 -10.0000 

Надеется, что это помогает.

+0

Большое спасибо. Он работает отлично. Поскольку я знаю точное число точек данных, я меняю ваше предложение на: x = textscan (fp, '% 7.3f', 10000). это считывает все данные в одной ячейке. Ваш намек действительно оценен. Я просто не знаю, почему textscan и fscanf разные, это такой случай. –

1

Для чтения текстовых файлов ASCII с четко определенным вводом, как указано в вопросе, вы должны использовать функцию dlmread.

>> X = dlmread(filename, delimiter); 

будет считывать числовые данные из filename, который разделителями (вдоль одной и той же строке) с delimiter в матрицу X. Для вас случае вы можете использовать

>> X = dlmread(filename, ' '); 

, как ваши данные разделяются пробелом, ' '.

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