2014-02-12 2 views
1

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


    master header line(s) 
    block 1 header line(s) 
     ... [m' x n] numerical matrix ... 
    block 2 header line(s) 
     ... [m'' x n] numerical matrix ... 
      ... 
    block N header line(s) 
     ... [m(N) x n] numerical matrix ... 

где n является постоянным, но m может принимать различные значения (как указано в расцвете Метки).

Мне интересно, есть ли простой способ загрузить данные этой организации в массив ячеек (или другую структуру какого-либо рода), имеющую следующую форму: каждый блок данных (как определено заголовком) представлен ячейка в массиве ячеек, содержимое которой представляет собой числовые данные в виде двойного массива. Чтобы конкретизировать это описание, желаемое представление MATLAB будет выглядеть следующим образом: cell {1} ​​содержит двойной массив, содержащий числовые данные, перечисленные в заголовке блока 1; cell {2} содержит двойной массив, содержащий числовые данные, перечисленные в заголовке блока 2; и т. д.

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

+0

Является ли файл ASCII или двоичным? Угадай текст. – chappjc

+0

ASCII: строки заголовков - текст; строки данных являются действительными числами с табуляцией – user001

+0

Я заметил несколько строк заголовков ... – chappjc

ответ

1

Мне нужно было сделать что-то подобное. Одним из способов, как вы говорите, является разделение на файлы. Но на самом деле, так как файл имеет набор структуру:

1 - open the file 
2 - read the first line (e.g. using fget) 
3 - Read the header (e.g. using fget) 
4 - read the next M rows (e.g. using fget, fread, etc.) and store as a matrix 
5 - loop back to 3 except when eof. 

(извинения за псевдокод, у меня нет доступа к Matlab на этом компьютере)

Да, это все манипуляции с файлом, но он становится расширяемым, когда файл не упорядочен, как пример, который вы дали (что имеет место в моем случае), и его очень легко читать и отлаживать. Однако он будет медленным, если ваш файл составляет сотни МБ.

+0

Спасибо за решение. Я сделал надзор в своем посте, а это значит, что матрицы mxn не имеют постоянных значений для m (n, однако, является постоянным). Как отрегулировать шаг 4 вашего псевдокода с учетом этого варианта? – user001

+1

Есть несколько способов. Во-первых, у ваших заголовков есть общий текст (т. Е. Будет ли у них некоторый символ в начале или обычное слово, например «заголовок»)? Если да, то вы можете искать его с помощью strfind. Если нет, то вы можете проверить первый символ строки, которую вы только что прочитали, - если это символ, то это заголовок. Если нет, то это строка из N значений, и в этом случае вы можете разделить ее (или вы можете перечитать строку с помощью textscan). Имеет ли это смысл? – Lazarus

+0

Да, все мои заголовки содержат строку, которая отличает их от числовых массивов. Считаете ли вы, что было бы быстрее сначала прочитать весь файл, а затем проанализировать позже или прочитать строку за строкой, проверив каждый, чтобы определить, является ли строка заголовком или нет? Мой входной файл составляет от 100 до 200 МБ. – user001

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