将除特定行外的所有行复制到文本文件中

3

我正在尝试将sample_data.txt中除了用户在文本框(txt_key)输入的字符串所在行以外的所有数据写入t_sdata.txt

[sample data]
key,item,qty
0001,Apple,5
0002,Orange,10
0003,Grapes,15

如果我在文本框中输入0002,那么t_sdata.txt应该包含:

[sample output data]
key,item,qty
0001,Apple,5
0003,Grapes,15

目前我所拥有的不能保存任何内容:

string plist = @"sample_data.txt";
string tdata = @"t_sdata.txt";
var dataline = File.ReadAllLines(plist)
    .SkipWhile(l => !l.StartsWith(txt_key.Text))
    .TakeWhile(l => !l.StartsWith(txt_key.Text) && l != null);
using (StreamWriter w = File.AppendText(tdata))
{
    foreach (var lines in dataline)
    {
        if (dataline == null)
            w.WriteLine(lines);
    }
}

我一直在尝试使用SkipWhile/TakeWhile,但显然我做错了什么。

(不确定是否相关)注意:关键字的长度可能不同,并且01可能具有与001不同的数据。


不确定这里会发生什么,因为如果(dataline == null),你在线编写一行StreamWriter。逻辑是对于dataline中的所有行,如果dataline为空,则写入一行 - 这没有意义,或者我错过了什么吗? - Martin Davies
1个回答

7

你的解决方案似乎很复杂,你并不真正关心哪一行没有被选入新文件:

string plist = @"sample_data.txt";
string tdata = @"t_sdata.txt";
string input = "0002";

File.WriteAllLines(tdata, File.ReadLines(plist).Where(line => !line.StartsWith(input)));

您的文件格式的稍微更好的解决方案是实际上将不同的字段分开,因此025不会匹配0220,Test,5:
File.WriteAllLines(tdata, File.ReadLines(plist)
                              .Where(line => line.Split(new char[]{ ',' }).First() != input));

2
不错,也许建议在这种情况下使用.StartsWith()比.Contains()更好? - Martin Davies
1
@MartinDavies 取决于原帖作者想要什么,代码中使用了 StartsWith,而他的文本中写着“可以找到”...我猜原帖作者会弄清楚的。 - nvoigt
可能你的意思是 File.WriteAllLines - Reza Aghaei
1
实际上,我认为使用StartsWith(input + ",")会更好,因为键可以具有不同的长度。 - Martin Davies
1
@MartinDavies 你是对的,我添加了一个改进的语句。 - nvoigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接