Чтение файла в Matlab - PullRequest
0 голосов
/ 16 марта 2012

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

Файл data.txt содержит данные, записанные в виде:

04001400 HI 34.50 118.27 19480701 08 LST
         0   0   0   0   0   0   0   0   0   0   0   0
       MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480801 08 LST
         0   0   0   0   0   0   0   0   0   0   0   0
       MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480901 08 LST
         0   0   0   0   0   0   0   0   0   0   0   0
       MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS

первое число - это номер станции, HI - регистр, третье и четвертое числа - координаты широты и долготы, другое число - год, месяц, день, а другое число (08) - часовой пояс, за которым следуетLST означает временные рамки.Следующие 24 числа или в приведенном выше примере 0 и MIS являются значениями для конкретного региона и времени.Я пытаюсь сохранить содержимое файла в виде матрицы в этом типе формата измерения [nx 31] (где 31 - количество столбцов, а n - общее количество строк в файле):

04001400 HI 34.50 118.27 19480701 08 LST 0   0   0   0   0   0   0   0   0   0   0   0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS

04001400 HI 34.50 118.27 19480801 08 LST 0   0   0   0   0   0   0   0   0   0   0   0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS

04001400 HI 34.50 118.27 19480901 08 LST 0   0   0   0   0   0   0   0   0   0   0   0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS

Я пытался кодировать его таким образом на основе функции textcan ():

fid = fopen('data.txt', 'rt');
data = textscan(fid, '%d %s %f %f %s %d %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s');
fclose(fid);

Но это не работает, как я описал выше.Есть ли способ, которым я могу это сделать?Спасибо за вашу помощь.

Примечание. Я хочу прочитать дату (19480701) в виде строки, чтобы позже можно было отформатировать ее как тип даты.

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Ваш пример кода не работает, потому что textscan() предполагает, что каждая строка в файле будет иметь одинаковый формат. То есть, чтобы использовать textscan(), каждая строка должна иметь одинаковое количество столбцов, содержащих данные одинакового типа.

Вместо этого я бы воспринимал данные как что-то вроде формата значений через запятую. Разбейте каждый ряд на список токенов, разделенных пробелом, , как предложено Робом Хенсоном здесь :

>> string = 'Need-to-split-this-string'

string =

Need-to-split-this-string

>> parts = strread(string,'%s','delimiter','-')
parts =

    'Need'
    'to'
    'split'
    'this'
    'string'

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


В качестве альтернативы, вы можете выполнить предварительную обработку текстового файла, чтобы переформатировать каждый раздел из трех строк, чтобы он находился в одной строке. (Просто удалите первое и второе из каждых трех символов новой строки.) Затем используйте регулярное выражение для замены пробелов запятыми. В итоге вы получите что-то вроде:

04001400,HI,34.50,118.27,19480701,08,LST,0,0,0,0,0,0,0,0,0,0,0,0,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS
04001400,HI,34.50,118.27,19480801,08,LST,0,0,0,0,0,0,0,0,0,0,0,0,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS
04001400,HI,34.50,118.27,19480901,08,LST,0,0,0,0,0,0,0,0,0,0,0,0,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS

В таком формате вы можете использовать textscan() или, что лучше, csvread().

0 голосов
/ 16 марта 2012

На самом деле код, который вы написали, должен быть очень близок к работе.Вам просто нужно сказать, чтобыcancan () также рассматривал символы новой строки как обычный символ пробела.

Попробуйте удалить пробелы в строке формата и использовать параметр «пробел» для добавления «\ n»:

data=textscan(fid, '%d%s%f%f%s%d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s','whitespace',' \b\t\n';

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...