【问题标题】:Search a text file for specific words using matlab and add string?使用matlab在文本文件中搜索特定单词并添加字符串?
【发布时间】:2017-12-30 04:11:00
【问题描述】:

无法找到如何在任何地方搜索文本文件中的特定单词,所以就到这里了,这就是我现在所拥有的,只需阅读并打印整个文本文件。 我的文本文件包含一些词,如:

K_G_M_H_NICK_MA,0,7500

P_SA_SWITCH_P_MPE_VL,0,1

如果字符串以 'K' 开头,则无论 K 后面如何,都必须在行尾写上 'spec'。输出必须是那么

K_G_M_H_NICK_MA,0,7500 规格

如果字符串以 'P' 开头,则无论 P 后面如何,都必须在行尾写上 'test'。输出必须是那么

P_SA_SWITCH_P_MPE_VL,0,1 测试

【问题讨论】:

  • @Chris Taylor 你能看看这个问题吗?谢谢!
  • 这些文件有多大?

标签: string matlab cell


【解决方案1】:

不幸的是,MATLAB 没有此功能。您别无选择,只能阅读每一行文本,检查您需要的内容,然后保存一个新文件。您可以使用fgetl 从文本文件中查询一行。对fgetl 的后续调用会读取下一行并记住您读取的最后一行。您可以将它与您的标准 fopenfclose 结合使用来打开和关闭文件。在使用fgetl 之前,您需要使用fopen 引用打开的文件。假设您的文件名为text.txt,只需读入该行,检查您的条件的第一个字符,然后在行尾打印出您需要的内容(如果它匹配)。在您的代码前后修剪任何空格可能是明智之举,因此strtrim 可能对您有用。像这样的东西应该可以工作,还假设您要写入一个名为 text_new.txt 的新文件:

fid = fopen('text.txt', 'r'); % Open up the file
fidw = fopen('text_new.txt', 'w'); % Open up a new file to write

tline = fgetl(fid); % Get the first line in the text file

while ischar(tline) % As long as this line contains characters (i.e. not end of the file)
    % Trim the whitespace
    tline = strtrim(tline);
    % Check if first character is K or k, then write spec at the end of the line
    if tline(1) == 'k' || tline(1) == 'K'
        fprintf(fidw, '%s spec\n', tline);
    % Check if first character is P or p, then write test at the end of the line
    elseif tline(1) == 'p' || tline(1) == 'P'
        fprintf(fidw, '%s test\n', tline);
    % Write the line as is if no conditions match
    else
        fprintf(fidw, '%s\n', tline);
    end

    % Get the next line in the file
    tline = fgetl(fid);
end

% Close the files now
fclose(fid);
fclose(fidw);

【讨论】:

  • 由于 MATLAB 通常具有较高的 FIO 开销,内存允许将所有内容读入内存并使用类似 regexprep(或者可能是 stringreplace method)之类的东西来进行替换( s) 一口气。
  • @excaza 是的,但我不对输入文件做任何假设。它可能非常大,这就是为什么我默认逐行。尽管如此,你的评论是完全有效的。如果 OP 更新她的问题以谈论这些有多大,我会将其添加为另一种方法,或者您可以将其添加为单独的答案。
  • 该文件有 ca 1100 行.. 两种解决方案都适合我!谢谢你们!!
  • @lara 不客气。如果您不再需要帮助,请将我们的任一答案标记为已接受,以便让社区知道您不再需要帮助。祝你好运。
  • @rayryeng:是的,我想要它。我在上面问了最后一个问题:如果我想复制该行并在下一行中添加一些文本,以及如何到达这与您的代码?第 1 行:K_G_M_H_NICK_MA,0,7500 第 2 行:K_G_M_H_NICK_MA,0,7500 规范?
【解决方案2】:

如果您有足够的内存来加载整个文件,您可以利用regexprep 等工具一次性对整个文档进行操作,这可能会在比较和文件输入/输出方面节省一些时间。

对于regexprep 示例,我们可以执行以下操作:

% Load entire data file into memory (cell array)
fID =  fopen('mydata.txt', 'r');
tmpdoc = {};
ii = 1;
while ~feof(fid)
    tmpdoc{ii} = fgetl(fID);
    ii = ii + 1;
end
fclose(fID);  % Clean up

% Make the necessary replacements
% String insensitive search
tmpdoc = regexprep(tmpdoc, '(^K.*)$', '$0 spec', 'preservecase'); % Find lines (cells) that begin with K
tmpdoc = regexprep(tmpdoc, '(^P.*)$', '$0 test', 'preservecase'); % Find lines (cells) that begin with P

% Write data
fID_new = fopen('mydata_new.txt', 'w');
fprintf(fID_new, '%s\n', tmpdoc{:});
fclose(fID_new);  % Clean up

对于 2000 行文件的基本计时(只是重复两行,这是最坏的情况),这种方法比 rayryeng's answer 快大约 3 倍,但他的方法只花了大约 0.25 秒,所以仍然足够快。

【讨论】:

  • 该文件有 ca 1100 行。谢谢您的回答。最后一个问题:如果我想复制该行并在下一行中添加一些文本,以及如何使用您的代码来实现这一点?第 1 行:K_G_M_H_NICK_MA,0,7500 第 2 行:K_G_M_H_NICK_MA,0,7500 规范?
  • 您可以将替换字符串更改为'$0\n$0 spec'$0 表示匹配正则表达式的文本部分,在我们的例子中是整行。
猜你喜欢
  • 2014-03-10
  • 1970-01-01
  • 2014-06-20
  • 2015-02-18
  • 2018-07-17
  • 2012-05-25
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多