Текстовое сканирование Matlab с добавлением дополнительных строк с нулями или NaN

Я пытаюсь прочитать файл .dat, содержащий десятки тысяч строк, где каждая из них выглядит примерно так:

   1.9681968    0   0   19.996  0   61  100 1.94E-07    6.62E-07  
   2.330233     0   0   19.996  0   61  100 1.94E-07    6.62E-07
   2.6512651    0   0   19.997  0   61  100 1.94E-07    6.62E-07
   3.5923592    0   0   19.998  0   61  100 1.96E-07    6.62E-07

Сейчас, например, я пытаюсь прочитать это с помощью

    Data = textscan(fid, %.9f%*f%*f%.9f%*f%*f%*f%.9f)

где формат строки зависит от того, какой столбец я хочу прочитать.

При чтении больших файлов первый столбец массива ячеек «Данные» станет

    1.96819680000000
    0
    2.33023300000000
    2.65126510000000
    0
    3.59235920000000
    0

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

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

Но, если возможно, я бы хотел не читать все как строки и не конвертировать все в двойные числа.

Любые идеи?


person woodenflute    schedule 07.08.2015    source источник
comment
Первая строка вашего файла не имеет такого же количества столбцов, как другие.   -  person horchler    schedule 07.08.2015
comment
Извините, ошибка с моей стороны. Я исправлю это!   -  person woodenflute    schedule 10.08.2015
comment
У вас есть только 8 %f в вашем спецификаторе формата, но у вас есть 9 столбцов в вашем файле. Вот почему у вас несогласованный вывод с дополнительными строками. Программа считывает 8 значений в одной строке, затем пытается запустить другую строку вывода... считывает только одно значение, оставшееся в строке, не может прочитать больше, поэтому закрывает строку, начинает другую строку, читает 8 значений... и т.д.. .   -  person Hoki    schedule 10.08.2015
comment
На самом деле, я использовал %*[^\n] в конце своего строкового формата, который должен позаботиться обо всем остальном. Но может вы и правы в своих рассуждениях, я проверю, так ли это было. Спасибо!   -  person woodenflute    schedule 10.08.2015


Ответы (1)


Я думаю, что проблема в строке формата. Попробуйте строку формата, показанную ниже.

fid = fopen('test.txt'); 
% data = textscan(fid, '%.9f%*f%*f%.9f%*f%*f%*f%.9f')
data = textscan(fid, '%f %f %f %f %f %f %f %f %f');
data = cell2mat(data)
fclose(fid);

Где test.txt — это текстовый файл, содержащий данные вашего примера. Приведенный выше код дает следующий результат.

1.9682         0         0   19.9960         0   61.0000  100.0000    0.0000       NaN
2.3302         0         0   19.9960         0   61.0000  100.0000    0.0000    0.0000
2.6513         0         0   19.9970         0   61.0000  100.0000    0.0000    0.0000
3.5924         0         0   19.9980         0   61.0000  100.0000    0.0000    0.0000

Обратите внимание на значение NaN, когда текст содержит только восемь значений. Если вы хотите указать значение по умолчанию для случаев, когда строки содержат меньше значений, используйте настройку EmptyValue:

data = textscan(fid, '%f %f %f %f %f %f %f %f %f','EmptyValue', 42);

Тогда вы получите:

1.9682         0         0   19.9960         0   61.0000  100.0000    0.0000   42.0000
2.3302         0         0   19.9960         0   61.0000  100.0000    0.0000    0.0000
2.6513         0         0   19.9970         0   61.0000  100.0000    0.0000    0.0000
3.5924         0         0   19.9980         0   61.0000  100.0000    0.0000    0.0000

Затем вы можете получить первый столбец, проиндексировав результирующую матрицу, как эта data(:,1), которая выводит следующее:

1.9682
2.3302
2.6513
3.5924
person nalyd88    schedule 07.08.2015
comment
Привет, спасибо за ваш ответ! Проблема не в формате строки, я допустил несколько ошибок, пытаясь сделать пример. Проблема в том, что вводятся новые пустые строки, помещаемые между реальными строками. - person woodenflute; 10.08.2015
comment
Это может произойти, если ваша строка формата слишком короткая (т. е. в ней восемь %f, но данные имеют девять значений). Вот почему я рекомендовал использовать девять %f, а затем указать значение по умолчанию, когда текст содержит только восемь значений. - person nalyd88; 10.08.2015
comment
Похоже, это действительно было так! Благодарю вас! - person woodenflute; 11.08.2015