如果文件主要是文本,如何使用 MATLAB 中的“Textscan”读取一系列数字?
题
我有一个文本文件,其中包含 3 个数字的字符串,我需要将其读入 MATLAB。
例如:
#######################
#
#
# Text Text Text
#
#
#######################
Blah blah blah = ####
Blah blah blah = ####
Blah blah blah = ####
Blah blah blah = ####
Blah blah blah = ####
Blah blah blah = ####
I_NEED_THIS_STRING = 1234.5 6789.0 1234.5 !Comment blah blah blah
我需要将这 3 个数字读入一个数组。
请帮忙。
谢谢
解决方案
如果大部分文件是无关的应用程序,我建议用你喜欢的脚本语言或命令行工具预处理,找到相关线路和使用textscan()上。
e.g,从shell提示:
grep ^I_NEED_THIS_STRING infile > outfile
在MATLAB:
fid = fopen('outfile');
C = textscan(fid, 'I_NEED_THIS_STRING = %f %f %f')
fclose(fid)
请参阅 textscan文档了解更多信息
其他提示
另一种方法是使用 导入数据 将整个文件读入字符串元胞数组(每个元胞一行),然后使用 STRMATCH 查找包含该字符串的单元格 'I_NEED_THIS_STRING'
, ,然后使用 斯卡尼夫 从该单元格中提取 3 个值:
>> data = importdata('mostly_useless_text.txt','\n'); %# Load the data
>> index = strmatch('I_NEED_THIS_STRING',data); %# Find the index of the cell
%# containing the string
>> values = sscanf(data{index},'I_NEED_THIS_STRING = %f %f %f') %# Read values
values =
1.0e+003 *
1.2345
6.7890
1.2345
如果文件可能有 很多 如果您感兴趣的行之前或之后有无用的文本,那么您可能会通过将其全部加载到变量中来占用 MATLAB 中的大量内存。您可以通过使用循环和函数一次加载和解析一行来避免这种情况 FGETS:
fid = fopen('mostly_useless_text.txt','r'); %# Open the file
newLine = fgets(fid); %# Get the first line
while newLine ~= -1 %# While EOF hasn't been reached
if strmatch('I_NEED_THIS_STRING',newLine) %# Test for a match
values = sscanf(newLine,'I_NEED_THIS_STRING = %f %f %f'); %# Read values
break %# Exit the loop
end
newLine = fgets(fid); %# Get the next line
end
fclose(fid); %# Close the file
不隶属于 StackOverflow