How to process a csv file where numbers and text are at the same column?

4 ビュー (過去 30 日間)
Nivodi
Nivodi 2018 年 7 月 22 日
コメント済み: Nivodi 2018 年 9 月 5 日
Hello, everyone. I have the attached CSV file and there are some things that I have to do:
  1. create a table,
  2. read every text or number that they are, after the colon (:),
  3. read all the rows from 1-37 and
  4. transfer the variables names at the first row and the text and numbers to the second row meaning a table 2X37.
I kindly asking for help because I have totally 7400 files to process!!! Thank you in advance.
  2 件のコメント
Walter Roberson
Walter Roberson 2018 年 7 月 22 日
That appears to be the 1991 MSA/MAS spectral file format, as described at https://www.microscopy.org/resources/scientific_data/HMSAFileFormat-Presentation_2012_small.pdf
Can you output as .hmsa instead? If so then I see https://github.com/pyhmsa/pyhmsa-matlab which appears to be python code to convert .hmsa into matlab .mat files.
Nivodi
Nivodi 2018 年 7 月 23 日
No, unfortunately, I can't.

サインインしてコメントする。

採用された回答

Image Analyst
Image Analyst 2018 年 7 月 22 日
That's not a CSV file. You might have to write a custom reader for it. Here's a start:
fullFileName = fullfile(pwd, 'test2_seq.csv')
% Open the file.
fileID = fopen(fullFileName, 'rt');
% Read the first line of the file.
textLine = fgetl(fileID);
while ischar(textLine)
% Read the remaining lines of the file.
fprintf('%s\n', textLine);
if contains(textLine, '#DATE', 'IgnoreCase', true)
colonLocation = strfind(textLine, ':');
semicolonLocation = strfind(textLine, ';');
DATE = strtrim(textLine(colonLocation + 2 : semicolonLocation(1)));
elseif contains(textLine, '#TIME', 'IgnoreCase', true)
elseif contains(textLine, '#OWNER', 'IgnoreCase', true)
elseif contains(textLine, '#NPOINTS', 'IgnoreCase', true)
elseif contains(textLine, '#NCOLUMNS', 'IgnoreCase', true)
elseif contains(textLine, '#XUNITS', 'IgnoreCase', true)
elseif contains(textLine, '#YUNITS', 'IgnoreCase', true)
elseif contains(textLine, '#DATATYPE', 'IgnoreCase', true)
elseif contains(textLine, '#XPERCHAN', 'IgnoreCase', true)
elseif contains(textLine, '#OFFSET', 'IgnoreCase', true)
elseif contains(textLine, '#OFFSET', 'IgnoreCase', true)
elseif contains(textLine, '#LIVETIME', 'IgnoreCase', true)
elseif contains(textLine, '#SIGNALTYPE', 'IgnoreCase', true)
% etc.
end
% Read the next line.
textLine = fgetl(fileID);
end
% All done reading all lines, so close the file.
fclose(fileID);
  15 件のコメント
Walter Roberson
Walter Roberson 2018 年 7 月 25 日
You can zip the file and attach the zip
Nivodi
Nivodi 2018 年 7 月 25 日
Thank you, Walter! :))

サインインしてコメントする。

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2018 年 7 月 26 日
projectdir = '.'; %directory the files are in
dinfo = dir( fullfile(projectdir, '*.xsp') );
filenames = fullfile(projectdir, {dinfo.name});
nfiles = length(filenames);
table_so_to_speak = cell(nfiles, 1);
for K = 1 : nfiles
S = fileread( filenames{K} );
parts = regexp(S, '^#?(?<field>\w+)\s*: *(?<val>.*?)\r?$', 'names', 'lineanchors', 'dotexceptnewline');
table_so_to_speak{K} = [{parts.field}; {parts.val}];
end
However, I suspect you want more like
projectdir = '.'; %directory the files are in
dinfo = dir( fullfile(projectdir, '*.xsp') );
filenames = fullfile(projectdir, {dinfo.name});
nfiles = length(filenames);
table_so_to_speak = cell(nfiles+1, 1);
for K = 1 : nfiles
thisfile = filenames{K};
S = fileread( thisfile );
[~, basename] = fileparts(thisfile);
parts = regexp(S, '^#?(?<field>\w+)\s*: *(?<val>.*?)\r?$', 'names', 'lineanchors', 'dotexceptnewline');
if K == 1
table_so_to_speak(1,1:length(parts)+1) = [{'filename'}, {parts.field}];
end
table_so_to_speak(K+1,:) = [{basename}, {parts.val}];
end
  12 件のコメント
Nivodi
Nivodi 2018 年 9 月 5 日
Thank you very much both of you!!

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeDates and Time についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by