티스토리 뷰
참고 : 질문에 지정된 최신 파일 형식 (예 : 날짜와 시간 값 사이의 쉼표)을 사용하도록 답변을 업데이트했습니다. 또한 열 수는 알고 있지만 행 수는 가변적 인 매우 큰 파일을 처리하기 위해 아래 코드를 작성했습니다.
먼저 다음 업데이트 된 코드를 사용하여 파일을 읽어야합니다 ( FGETS 함수를 사용하여 맨 위 줄을 저장함 ).
fid = fopen('D:\file.txt','rt'); %# Open the file
topLine = fgets(fid); %# Read the top line and store it in a string
data = textscan(fid,'%f','Delimiter',',/:'); %# Read the data
fclose(fid); %# Close the file
다음으로 data
알려진 데이터 열 수를 사용하여 모양을 변경해야합니다 ( 날짜 및 시간 열은 계산 하지 않음).
N = 74; %# Number of columns of data after the date and time
data = reshape(data{1},N+6,[])';
이제 data
처음 6 개 열에 날짜 및 시간 정보 (월, 일, 연도,시, 분 및 초)가 포함되고 다른 모든 데이터가 나머지 N
열에 있는 행렬이 있습니다. 날짜 및 시간 값으로 작업을 수행해야하는 경우 DATENUM , DATESTR 및 DATEVEC 와 같은 다른 형식으로 변환하는 방법을 알아 내기 위해 다음 함수를 살펴볼 수 있습니다 .
의 값을 수정 한 후 data
for 루프와 FPRINTF 함수 를 사용하여 다시 저장할 수 있습니다 .
fid = fopen('newfile1.txt','wt'); %# Open the file
fprintf(fid,'%s',topLine); %# Print the top line
for i = 1:size(data,1) %# Loop over the rows of data
fprintf(fid,'%d/%d/%d, %d:%d:%d',data(i,1:6)); %# Print the date
fprintf(fid,', %.1f',data(i,7:end)); %# Print the data
fprintf(fid,'\n'); %# Print a newline
end
fclose(fid); %# Close the file
86400x80 행렬로 위의 코드를 실행했는데 data
데이터를 파일에 쓰는 데 약 30 초가 걸렸습니다.
dlmwrite는 아시다시피 ASCII 텍스트 파일에 변수 (예 : M 배열)를 씁니다. 함수에 대한 설명서를 확인하여 구분 문자를 설정하는 방법 (각 행의 값 사이에서, 가져 오기) 및 기존 파일에 추가하는 방법을 알아보십시오.
헤더 행을 작성하려면 문자열 배열을 설정하고 채우고 dlmwrite를 사용하여 출력 파일에 쓰는 것이 좋습니다.
이제 파일의 나머지 (M 배열과 날짜 / 시간의 선행 열 2 개)를 작성하려면 M 크기와 2 개의 추가 열을 더한 임시 배열을 만들어야합니다. 데이터 값은 부동 소수점 숫자이고 날짜와 시간은 일종의 구조화 된 데이터 (아마도 문자열)이므로 Mtemp는 문자열 배열이어야한다고 생각합니다. 생성 한 후에는 단일 dlmwrite 문을 사용하여 출력 파일에 추가 할 수 있습니다.
num2str은 벡터에서 원하는대로 작동하지만 값 사이에,를 넣도록 강제 할 수 있는지 확실하지 않습니다. 그러나 지정한 형식으로 숫자를 쓸 수 있습니다.
이것이 원하는 출력을 제공하지 않거나 배열이 복사 및 확장하기에 너무 크거나 제안 된 솔루션이 마음에 들지 않는 다른 이유가있는 경우 출력을 작성하기 위해 루프를 작성해야 할까 봐 걱정됩니다. 한 번에 한 줄씩, 저수준 파일 쓰기 기능을 사용합니다.
문안 인사
표
출처
https://stackoverflow.com/questions/1905061