从文本文件中删除特定行?

时间:2009-08-07 14:57:05

标签: c# text-files

我需要从文本文件中删除一条确切的行,但我不能在我的生活中锻炼如何去做这件事。

非常感谢任何建议或示例?

相关问题

Efficient way to delete a line from a text file (C#)

10 个答案:

答案 0 :(得分:39)

如果您要删除的行取决于该行的内容:

string line = null;
string line_to_delete = "the line i want to delete";

using (StreamReader reader = new StreamReader("C:\\input")) {
    using (StreamWriter writer = new StreamWriter("C:\\output")) {
        while ((line = reader.ReadLine()) != null) {
            if (String.Compare(line, line_to_delete) == 0)
                continue;

            writer.WriteLine(line);
        }
    }
}

或者如果它基于行号:

string line = null;
int line_number = 0;
int line_to_delete = 12;

using (StreamReader reader = new StreamReader("C:\\input")) {
    using (StreamWriter writer = new StreamWriter("C:\\output")) {
        while ((line = reader.ReadLine()) != null) {
            line_number++;

            if (line_number == line_to_delete)
                continue;

            writer.WriteLine(line);
        }
    }
}

答案 1 :(得分:13)

执行此操作的最佳方法是以文本模式打开文件,使用ReadLine()读取每一行,然后使用WriteLine()将其写入新文件,跳过要删除的一行。

据我所知,没有通用的delete-a-line-from-file函数。

答案 2 :(得分:7)

如果文件不是很大,一种方法是将所有行加载到数组中:

string[] lines = File.ReadAllLines("filename.txt");
string[] newLines = RemoveUnnecessaryLine(lines);
File.WriteAllLines("filename.txt", newLines);

答案 3 :(得分:2)

您实际上可以使用C#generics来实现这一目标:

        var file = new List<string>(System.IO.File.ReadAllLines("C:\\path"));
        file.RemoveAt(12);
        File.WriteAllLines("C:\\path", file.ToArray());

答案 4 :(得分:2)

没有火箭scien代码需要。希望这个简单的短代码help

List linesList = File.ReadAllLines("myFile.txt").ToList();            
linesList.RemoveAt(0);
File.WriteAllLines("myFile.txt"), linesList.ToArray());

使用this

public void DeleteLinesFromFile(string strLineToDelete)
    {
        string strFilePath = "Provide the path of the text file";
        string strSearchText = strLineToDelete;
        string strOldText;
        string n = "";
        StreamReader sr = File.OpenText(strFilePath);
        while ((strOldText = sr.ReadLine()) != null)
        {
            if (!strOldText.Contains(strSearchText))
            {
                n += strOldText + Environment.NewLine;
            }
        }
        sr.Close();
        File.WriteAllText(strFilePath, n);
    }

答案 5 :(得分:1)

  1. 阅读并记住每一行

  2. 确定您要摆脱的那个 的

  3. 忘掉那个

  4. 将其余部分写回到顶部 文件

答案 6 :(得分:0)

你是在Unix操作系统上吗?

您可以使用“sed”流编辑器执行此操作。阅读“sed”的手册页

答案 7 :(得分:0)

什么? 使用文件打开,搜索位置然后使用null流擦除行。

得了吗?简单,流,没有吃内存的数组,速度快。

关于vb的这项工作..示例搜索行culture = id其中,culture是namevalue,id是value,我们想将其更改为culture = en

Fileopen(1, "text.ini")
dim line as string
dim currentpos as long
while true
    line = lineinput(1)
    dim namevalue() as string = split(line, "=")
    if namevalue(0) = "line name value that i want to edit" then
        currentpos = seek(1)
        fileclose()
        dim fs as filestream("test.ini", filemode.open)
        dim sw as streamwriter(fs)
        fs.seek(currentpos, seekorigin.begin)
        sw.write(null)
        sw.write(namevalue + "=" + newvalue)
        sw.close()
        fs.close()
        exit while
    end if
    msgbox("org ternate jua bisa, no line found")
end while

这就是所有......使用#d

答案 8 :(得分:0)

这可以分三步完成:

// 1. Read the content of the file
string[] readText = File.ReadAllLines(path);

// 2. Empty the file
File.WriteAllText(path, String.Empty);

// 3. Fill up again, but without the deleted line
using (StreamWriter writer = new StreamWriter(path))
{
    foreach (string s in readText)
    {
        if (!s.Equals(lineToBeRemoved))
        {
            writer.WriteLine(s);
        }
    }
}

答案 9 :(得分:0)

我关心文件的原始结束行字符(“ \ n”或“ \ r \ n”),并希望将其保留在输出文件中(而不用当前环境的字符覆盖它们)其他答案似乎可以解决)。因此,我编写了自己的方法来读取一行而不删除结束行字符,然后在我的DeleteLines方法中使用了该行(我希望可以选择删除多行,因此要使用一组行号来删除)。

DeleteLines被实现为FileInfo扩展名,而ReadLineKeepNewLineChars被实现为StreamReader扩展名(但显然您不必那样做)。

public static class FileInfoExtensions
{
    public static FileInfo DeleteLines(this FileInfo source, ICollection<int> lineNumbers, string targetFilePath)
    {
        var lineCount = 1;

        using (var streamReader = new StreamReader(source.FullName))
        {
            using (var streamWriter = new StreamWriter(targetFilePath))
            {
                string line;

                while ((line = streamReader.ReadLineKeepNewLineChars()) != null)
                {
                    if (!lineNumbers.Contains(lineCount))
                    {
                        streamWriter.Write(line);
                    }

                    lineCount++;
                }
            }
        }

        return new FileInfo(targetFilePath);
    }
}

public static class StreamReaderExtensions
{
    private const char EndOfFile = '\uffff';

    /// <summary>
    /// Reads a line, similar to ReadLine method, but keeps any
    /// new line characters (e.g. "\r\n" or "\n").
    /// </summary>
    public static string ReadLineKeepNewLineChars(this StreamReader source)
    {
        if (source == null)
            throw new ArgumentNullException(nameof(source));

        char ch = (char)source.Read();

        if (ch == EndOfFile)
            return null;

        var sb = new StringBuilder();

        while (ch !=  EndOfFile)
        {
            sb.Append(ch);

            if (ch == '\n')
                break;

            ch = (char) source.Read();
        }

        return sb.ToString();
    }
}