替代文件.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对换行符不起作用。还有别的办法吗?
当然可以,为什么不用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
调用,因为看起来您可以在分号之前使用空格,我不认为您想要复制这些。