如何使用c#删除文件中特定行的文本而不创建不需要的空间?

时间:2017-02-05 14:40:04

标签: c#

我正在尝试从我创建的文件“Test.txt”中的特定行中删除文本。

这是用Test.txt写的文本:
1
2
3
4
5个

1
2
3
4
5个

1
2
3
4
5个

现在我想要发生的是当我要在第二次迭代中移除2 - 4时,输出应该是这样的:
1
2
3
4
5个

1
5个

1
2
3
4
5个

我想要的是只删除相应文本被删除的空格,最好不要涉及其他空格。 但当我尝试代码时,它给了我这个输出:
1
2
3
4
5个

1



5个

1
2
3
4
5个

正如你可以看到上面的输出,那就是我所说的不需要的空间。以下是我尝试过的代码:

 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;

 namespace TestCode
 {
   class Program2
  {
    static void Main()
    {
        lineChanger("", @"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\Test.txt", 8);
        lineChanger("", @"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\Test.txt", 9);
        lineChanger("", @"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\Test.txt", 10);

    }

    static void lineChanger(string newText, string fileName, int line_to_edit)
    {
        string[] arrLine = File.ReadAllLines(fileName);
        arrLine[line_to_edit - 1] = newText;
        File.WriteAllLines(fileName, arrLine);
    }
}
}

另外,请随意提出任何适当的技巧,并请提供实际的例子。

3 个答案:

答案 0 :(得分:1)

请看这可以吗?

        int removeAt = 7; //or any thing you want
        int linesToRemove = 3; //or any thing you want
        string s = System.IO.File.ReadAllText("Test.txt");
        List<string> arr = s.Split("\n".ToCharArray()).ToList();

        for (int i = 0; i < linesToRemove; i++)
            arr.RemoveAt(removeAt);
        string result = "";
        foreach (string str in arr)
        {
            result += str;
        }
        System.IO.File.WriteAllText("Test.txt", result);

我很高兴你说这对你有用,在这里我添加了另一种解决方案,也许在某些情况下你需要使用它:

        int removeAt = 7; //or any thing you want
        int linesToRemove = 3; //or any thing you want
        string s = System.IO.File.ReadAllText("Test.txt");
        List<string> arr = s.Split(new char[] { '\n' }).ToList();
        List<int> realBareRows = new List<int>();
        for (int i = 0; i < arr.Count; i++)
        {
            if (string.IsNullOrEmpty(arr[i].Replace("\r", "")))
                realBareRows.Add(i);
        }
        List<string> newArr = s.Split(System.Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();
        foreach (int j in realBareRows)
            newArr.Insert(j, "\n");

        for (int i = 0; i < linesToRemove; i++)
            newArr.RemoveAt(removeAt);

        string result = "";
        foreach (string str in newArr)
        {
            result += str + System.Environment.NewLine;
        }
        System.IO.File.WriteAllText("Test.txt", result);

答案 1 :(得分:0)

我建议您通过File.ReadLines删除这些行。你可以这样做:

foreach (var line in File.ReadLines(fileName))
{

   //Add it to your arrLine and don't insert a line based on your condition. 
}

我不太确定你的病情是什么。我认为它基于line_to_edit

希望这有帮助!

答案 2 :(得分:0)

您可以省略0长度的所有行

File.WriteAllLines(fileName, arrLine.Where(x => x.Length>0));