1

最初の単語が自分の持っている変数と一致する場合、テキストファイルから1行全体を削除するにはどうすればよいですか?

私が現在試しているのは:

List<string> lineList = File.ReadAllLines(dir + "textFile.txt").ToList();
lineList = lineList.Where(x => x.IndexOf(user) <= 0).ToList();
File.WriteAllLines(dir + "textFile.txt", lineList.ToArray());

しかし、私はそれを削除することはできません。

4

4 に答える 4

2

あなたが持っている唯一の間違いは、=0ではなくindexOfで<=0をチェックしていることです。

検索された文字列が文字列に含まれていない場合は、-1が返されます。

<= 0は、で始まるか含まないことを意味します

= 0は、<で始まることを意味します-これはあなたが望むものです

于 2012-05-18T18:01:35.413 に答える
1

このメソッドは、ファイルを一度にすべてではなく、行ごとに読み取ります。また、この実装では大文字と小文字が区別されることに注意してください。

また、先頭のスペースにさらされていないことも前提としています。

using (var writer = new StreamWriter("temp.file"))
{
    //here I only write back what doesn't match
    foreach(var line in File.ReadLines("file").Where(x => !x.StartsWith(user)))
        writer.WriteLine(line);  // not sure if this will cause a double-space ?
}

File.Move("temp.file", "file");
于 2012-05-18T17:49:31.240 に答える
1

あなたはかなり近くにいて、String.StartsWithそれをうまく処理します:

// nb: if you are case SENSITIVE remove the second argument to ll.StartsWith
File.WriteAllLines(
    path,
    File.ReadAllLines(path)
        .Where(ll => ll.StartsWith(user, StringComparison.OrdinalIgnoreCase)));

代わりに、パフォーマンスが良くない可能性のある非常に大きなファイルの場合:

// Write our new data to a temp file and read the old file On The Fly
var temp = Path.GetTempFileName();
try
{
    File.WriteAllLines(
        temp,
        File.ReadLines(path)
            .Where(
               ll => ll.StartsWith(user, StringComparison.OrdinalIgnoreCase)));
    File.Copy(temp, path, true);
}
finally
{
    File.Delete(temp);
}

指摘された別の問題は、ユーザーが次の場合、IndexOfとは一致としてStartsWith扱いABC、一致するものとして扱うことでした。ABCDEFABC

var matcher = new Regex(
    @"^" + Regex.Escape(user) + @"\b", // <-- matches the first "word"
    RegexOptions.CaseInsensitive);
File.WriteAllLines(
    path,
    File.ReadAllLines(path)
        .Where(ll => matcher.IsMatch(ll)));
于 2012-05-18T17:57:34.363 に答える
0
Use  `= 0` instead of `<= 0`. 
于 2012-05-18T17:48:30.367 に答える