我正在尝试从文件中读取字符,然后在删除注释后将它们附加到另一个文件中(后面跟着分号)。
来自父文件的示例数据:
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不适用于换行符。还有其他选择吗?
答案 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.