Использование переменной с fwrite и следующей строкой - PullRequest
0 голосов
/ 25 сентября 2019

Итак, я написал цикл, который построчно читает ряд файлов .txt и объединяет их в новый файл .txt.Проблема в том, что он просто там их всех и я не могу понять, как заставить его перейти к следующей строке после написания.

 steve = fopen('JuneWeather.txt','at');
       for i =152:181
        filename= sprintf('weather_data_2019_%d.txt', i);
        fid1=fopen(sprintf('%s%d',path,filename));  %.... open the file, MATLAB assigns an ID
        count=-1;              %     line counter
        while ~feof(fid1)      %     test for end of file (EOF)
            line=fgetl(fid1);  %     get the next line
            %disp(line);        %     show the line
            fwrite(steve, line);
            fwrite(steve, '\n');
            count=count+1;
            % if count>100; break; end;  %  only for debugging
            if count==0; continue; end   %  skip the header line 
            %  header line in the file:
            %Datetime,RecNbr,WS_mph_Avg,PAR_Den_Avg,WS_mph_S_WVT,WindDir_SD1_WVT,AirTF_Avg,Rain_in_Tot,RH,WindDir_D1_WVT
            %  return;  %... stops script right here
        end
        fclose(fid1);
        end
    fclose(steve)

Лучший результат, который я получил, это \ n между каждой строкой, без разрывов строк.Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Проблемы:

В вашем коде есть несколько ошибок или, по крайней мере, сбивает с толку:

Во-первых, вы открываете выходной файл в режиме 'text' (обозначается tв вашем заявлении об открытии файла steve=fopen('JuneWeather.txt','at');).Это хорошо, так как вы имеете дело с текстовыми файлами, но затем вы используете fwrite, низкоуровневую функцию, предназначенную для записи двоичных данных.

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

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

Что касается выбранного символа новой строки, вы можете использоватьавтоматический метод вроде:

if ispc
    strNewline = '\r\n' ;
else
    strNewline = '\n' ;
end

Но в вашем случае это даже не нужно.Поскольку вы открыли выходной файл в режиме text , документация сообщает вам:

Чтобы открыть файлы в текстовом режиме, присоедините букву 't' к аргументу разрешения, например'rt' или 'wt +'.

В системах Windows® в текстовом режиме:

- Read operations that encounter a carriage return followed by a newline character ('\r\n') remove the carriage return from the input.
- Write operations insert a carriage return before any newline character in the output.

В последней строке указывается, что MATLAB автоматически управляет возвратом каретки (\r), поэтому вам не нужно беспокоиться об этом.Просто используйте только \n, когда вам это нужно.

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


Решение (я):

Для целей примера я создал 2 текстовых файла test_1.txt и test_2.txt, которые содержат толькозаголовок и несколько строк значений, разделенных комой каждая.Код, который работает и наиболее близок к вашей реализации, выглядит следующим образом (я удалил строки отладки о count и комментариях, не стесняйтесь вставлять его там, где это необходимо):

fileOut = 'testout.txt' ;
steve = fopen(fileOut,'at');
for i =1:2
    fid1=fopen(sprintf('test_%d.txt', i));
    while ~feof(fid1)
        % This reads the line, but REMOVE the newline character at the end
        line=fgetl(fid1);
        % so we write the line and ADD the newline character at the end
        fprintf(steve, [line '\n']);
    end
    fclose(fid1);
end
fclose(steve) ;

В качестве альтернативы:

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

Что-то вроде:

%% merge text data using "fileread"
steve = fopen('testout.txt','a');
for i =1:2
    StringFileContent = fileread( sprintf('test_%d.txt', i) ) ;
    fprintf(steve, StringFileContent );
end
fclose(steve) ;

Будет выдавать точно такой же результат, что и выше, и будет значительно быстрее в течение длительного времении / или многочисленные файлы.Просто обратите внимание в последнем фрагменте кода, файл NOT открыт в текстовом режиме, как и раньше.В противном случае matlab будет автоматически вставлять \r перед каждым \n, даже если \r уже присутствовал (фактически дублируя каждый \r).Это потому, что функция fileread не связывается с символами новой строки, она просто читает все как строку.

0 голосов
/ 26 сентября 2019

Проблема в том, что fwrite интерпретирует ваш \ n как два символа, а не символ новой строки, который вы ищете.

Если у вас есть Matlab> 2016b, вы можете просто использовать вместо него символ новой строки:

fwrite(steve,newline);

Если у вас нет, вам нужно знать, в какой операционной системе вы находитесь: Windows:

fwrite(steve,sprintf('\r\n'));

Unix:

fwrite(steve,sprintf('\n'));

Кроме того, вы можете взглянуть на функцию fprintf.Эта интерпретирует escape-последовательности, такие как \ n и т. Д.

Также, пожалуйста, проверьте строку:

fid1=fopen(sprintf('%s%d',path,filename));

Я подозреваю, что она должна выглядеть так:

fid1=fopen(sprintf('%s%s',path,filename));

Однако, Я бы посоветовал использовать функцию

fid1=fopen(fullfile(path, filename));

, которая позаботится о таких вещах, как \ / для систем Unix / Windows.

Редактировать: на тот случай, если вы хотите использовать вместо этого функцию fprintfof fwrite: удалите строки fwrite и замените их на.

fprintf(steve, '%s\n',line);

(% s важен, иначе fprintf может интерпретировать любые \ символы как escape-последовательность.)

...