[英]Removing carriage return from specific line in c#
我在文本文件 (csv) 中有這種類型的數據:
column1|column2|column3|column4|column5 (\r\n)
column1|column2|column3|column4|column5 (\r\n)
column1|column2 (\r\n)
column2 (\r\n)
column2|column3|column4|column5 (\r\n)
我想刪除第 3 行和第 4 行的 \r\n 以具有:
column1|column2|column3|column4|column5 (\r\n)
column1|column2|column3|column4|column5 (\r\n)
column1|column2/column2/column2|column3|column4|column5 (\r\n)
我的想法是,如果該行沒有 4 個列分隔符(“|”),則刪除 CRLF,並重復該操作,直到只有正確的行。
這是我的代碼:
String path = "test.csv";
// Read file
string[] readText = File.ReadAllLines(path);
// Empty the file
File.WriteAllText(path, String.Empty);
int x = 0;
int countheaders = 0;
int countlines;
using (StreamWriter writer = new StreamWriter(path))
{
foreach (string s in readText)
{
if (x == 0)
{
countheaders = s.Where(c => c == '|').Count();
x = 1;
}
countlines = 0;
countlines = s.Where(d => d == '|').Count();
if (countlines == countheaders)
{
writer.WriteLine(s);
}
else
{
string s2 = s;
s2 = s2.ToString().TrimEnd('\r', '\n');
writer.Write(s2);
}
}
}
問題是我一次讀取文件,所以第 4 行的換行符被刪除,第 4 行和第 5 行在一起......
您可能可以執行以下操作(現在無法測試,但它應該可以工作):
IEnumerable<string> batchValuesIn(
IEnumerable<string> source,
string separator,
int size)
{
var counter = 0;
var buffer = new StringBuilder();
foreach (var line in source)
{
var values = line.Split(separator);
if (line.Length != 0)
{
foreach (var value in values)
{
buffer.Append(value);
counter++;
if (counter % size == 0)
{
yield return buffer.ToString();
buffer.Clear();
}
else
buffer.Append(separator);
}
}
}
if (buffer.Length != 0)
yield return buffer.ToString();
你會像這樣使用它:
var newLines = batchValuesIn(File.ReadLines(path), "|", 5);
這個解決方案的好處是你永遠不會加載到 memory 整個原始源。 您只需即時構建線條。
免責聲明:對於錯誤輸入的字符串,這可能會表現得很奇怪。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.