替代文件.AppendAllText为换行符

本文关键字:换行符 AppendAllText 文件 | 更新日期: 2023-09-27 18:16:28

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

来自父文件的示例数据:

           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对换行符不起作用。还有别的办法吗?

替代文件.AppendAllText为换行符

当然可以,为什么不用File.AppendAllLines呢?

向文件追加行,然后关闭文件。如果指定的文件不存在,该方法创建一个文件,将指定的行写入文件,然后关闭该文件。

它接受任意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);
输出:

姓名- Harley Brown
年龄- 20

您甚至可以将foreach-loop更改为LINQ表达式,如果您喜欢LINQ:

List<string> linesToAppend = linesFromFile.Select(line => line.Split(';').FirstOrDefault().Trim()).ToList();

当。net框架充满了有用的字符串操作函数时,为什么要使用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.

您可以对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调用,因为看起来您可以在分号之前使用空格,我不认为您想要复制这些。