用于换行的File.AppendAllText的替代方案

时间:2014-08-05 05:09:08

标签: c# file append text-files

我正在尝试从文件中读取字符,然后在删除注释后将它们附加到另一个文件中(后面跟着分号)。

来自父文件的示例数据:

           Name- Harly Brown             ;Name is Harley Brown

           Age- 20                  ;Age is 20 years

期望的结果:

           Name- Harley Brown

           Age- 20

我正在尝试以下代码 -

        StreamReader infile = new StreamReader(floc + "G" + line + ".NC0");
        while (infile.Peek() != -1)
        {
            letter = Convert.ToChar(infile.Read());
            if (letter == ';')
            {
                infile.ReadLine();
            }

            else
            {

                System.IO.File.AppendAllText(path, Convert.ToString(letter));

            }
         }

但我得到的输出是 -

            Name- Harley Brown  Age-20

因为AppendAllText不适用于换行符。还有其他选择吗?

3 个答案:

答案 0 :(得分:2)

当然,为什么不使用File.AppendAllLines。请参阅文档here

  

将行追加到文件中,然后关闭该文件。如果指定的文件不存在,则此方法创建文件,将指定的行写入文件,然后关闭文件。

它接收任何IEnumerable<string>并将每一行添加到指定的文件中。因此,它总是在新行上添加该行。

小例子:

const string originalFile = @"D:\Temp\file.txt";
const string newFile = @"D:\Temp\newFile.txt";

// Retrieve all lines from the file.
string[] linesFromFile = File.ReadAllLines(originalFile); 

List<string> linesToAppend = new List<string>();

foreach (string line in linesFromFile)
{
    // 1. Split the line at the semicolon.
    // 2. Take the first index, because the first part is your required result.
    // 3. Trim the trailing and leading spaces.
    string appendAbleLine = line.Split(';').FirstOrDefault().Trim();

    // Add the line to the list of lines to append.
    linesToAppend.Add(appendAbleLine);
}

// Append all lines to the file.
File.AppendAllLines(newFile, linesToAppend);

输出:

  

姓名 - 哈利·布朗   年龄20岁

如果您更喜欢LINQ:

,甚至可以将foreach循环更改为LINQ表达式
List<string> linesToAppend = linesFromFile.Select(line => line.Split(';').FirstOrDefault().Trim()).ToList();

答案 1 :(得分:0)

您可以使用LINQ,System.File.ReadLines(string)System.File.WriteAllLines(string, IEnumerable<string>)执行此操作。您也可以以查找和替换方式使用System.File.AppendAllLines(string, IEnumerable<string>),如果这实际上是您要使用的功能。正如名称所暗示的那样,区别在于它是将所有内容都写为新文件还是只附加到现有文件中。

System.IO.File.WriteAllLines(newPath, System.IO.File.ReadLines(oldPath).Select(c =>
                   {
                       int semicolon = c.IndexOf(';');

                       if (semicolon > -1)
                           return c.Remove(semicolon);
                       else
                           return c;
                   }));

如果您不熟悉LINQ语法,这里的想法是循环遍历文件中的每一行,如果它包含分号(即IndexOf返回超过-1的内容我们切断它,否则,我们只是返回字符串。然后我们将所有这些写入文件。与此相当的StreamReader将是:

using (StreamReader reader = new StreamReader(oldPath))
using (StreamWriter writer = new StreamWriter(newPath))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
       int semicolon = line.IndexOf(';');

       if (semicolon > -1)
           line = c.Remove(semicolon);

       writer.WriteLine(line);
    }
}

虽然,当然,这会在最后提供一个额外的空行而且LINQ版本不会(据我所知,我发现我不是百分百肯定,但是如果读这篇文章的人确实知道我会很感激评论。

另一个需要注意的重要事项是,只需查看原始文件,您可能需要添加一些Trim次调用,因为看起来您的分号前可以有空格,而我想象您不想要那些复制过来的。

答案 2 :(得分:0)

为什么在.NET Framework充满有用的字符串操作函数时使用char by char?

此外,如果只能使用文件写入功能一次,那么多次使用文件写入功能,耗费时间和资源!

StreamReader stream = new StreamReader("file1.txt");
string       str    = "";

while ((string line = infile.ReadLine()) != null) { // Get every line of the file.
    line = line.Split(';')[0].Trim();               // Remove comment (right part of ;) and useless white characters.
    str += line + "\n";                             // Add it to our final file contents.
}

File.WriteAllText("file2.txt", str); // Write it to the new file.