Matlab: как экспортировать данные "дата и время" во внешний файл? «Ошибка при использовании fprintf. Функция не определена для входов 'cell'». - PullRequest
1 голос
/ 10 июля 2020

Я использую Matlab 2016a, и я немного новичок ie.

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

'2019-07-10 20:00:00'

Все остальные импортированные столбцы состоят из чисел. Я хочу напечатать только те столбцы, которые я импортировал в файл .txt. Для столбцов чисел это работает:

fileID = fopen('fag_1.txt','w'); fprintf(fileID,'%f\n',fag_1); fclose(fileID);

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

fileID = fopen('DT.txt','w'); fprintf(fileID, '%23s\n', DT); fclose(fileID);

Оно дало мне эту ошибку (которая похожа на ошибку, которую я получаю для всех других методов, которые я пробовал):

Error using fprintf
Function is not defined for 'cell' inputs.

Error in XXX (line 230)
fileID = fopen('DT.txt','w'); fprintf(fileID, '%23s\n', DT); fclose(fileID);

У кого-нибудь есть идеи, как с этим бороться? Спасибо.

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

DT  MOD UNMOD   PRESS
2015-07-01 00:00:00 -999.0  -999.0  -999.0

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Использование Matlab для извлечения нескольких столбцов из текстового файла похоже на использование вашего автомобиля для проезда одного городского квартала. Вы можете это сделать, но это потребует много дополнительной работы и ресурсов (денег, бензина), и есть гораздо лучшие инструменты для работы (ходить, кататься на велосипеде). В этом случае awk - хороший выбор. Он разработан специально для этого типа задач и хорошо работает.

Однако прямой ответ на ваш вопрос в Matlab - это именно то, что говорится в сообщении об ошибке: вы пытаетесь дать fprintf ячейку для печати, и fprintf не может печатать ячейки. Например, создайте текстовый файл, состоящий из четырех строк образцов данных из вашего вопроса («2015-07-01 00:00:00 -999.0 -999.0 -999.0»). Если вы импортируете этот файл и посмотрите на результат в Matlab, мы увидим:

>> fin = fopen('sline.txt','r');
>> sin = textscan(fin,'%s %s %f %f %f')

sin =

  1×5 cell array

{4×1 cell}    {4×1 cell}    {4×1 double}    {4×1 double}    {4×1 double}

>> fclose(fin);

Мы видим, что импортированные данные были помещены в ячейки . Если вы хотите ссылаться на элементы внутри ячеек (в данном случае на строки, чтобы их можно было распечатать), используйте {}. Например:

fout2 = fopen('sout2.txt','w');    
for k=1:4
    fprintf(fout2,'%s %s %f %f %f\n',sin{1,1}{k},sin{1,2}{k},sin{1,3}(k),sin{1,4}(k),sin{1,5}(k))
end
fclose(fout2);

Таким образом, вы можете сделать это в Matlab, но для этого потребуется восемь строк уродливого кода.

1 голос
/ 10 июля 2020

Мне не удалось понять, как это сделать в Matlab, но я нашел другое решение здесь, в Stackoverflow, которое использует awk (см. Ниже).

awk '{print $1}' test.txt > test2.txt

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

...