[英]Removing trailing space from CSV in C#
我有一個CSV文件,在某些列中有很多尾隨空格,因此我試圖編寫一個簡單的Windows窗體應用程序,該應用程序循環遍歷CSV中的所有行並刪除尾隨空格。 我想我已經很遙遠了,但是我有一種C#將此視為一行的感覺:
"Lorem ipsum dolor sit amet","Default ",9999,1,"base "
雖然應該將其視為一行:
"Lorem ipsum dolor sit amet"
這是我現在擁有的代碼:
String path = @"C:\Users\me\Documents\test.csv";
string[] allLines = File.ReadAllLines(path);
using (StreamWriter sw = new StreamWriter(path))
{
foreach (string line in allLines)
{
if (!string.IsNullOrEmpty(line) && line.Length > 1)
{
line.TrimEnd(' ');
sw.WriteLine(line);
//sw.WriteLine(line.TrimEnd(' '));
}
}
}
Console.WriteLine(allLines);
Console.WriteLine("Done");
如何確保我的CSV文件是這樣的:
"Lorem ipsum dolor sit amet ","Default ",9999,1,"base "
"simple","Default ",9999,1," base"
"test ","Default ",9999,1,"base"
像這樣運行C#代碼后,它就會出來(因此,末尾沒有空格):
"Lorem ipsum dolor sit amet","Default ",9999,1,"base"
"simple","Default",9999,1,"base"
"test","Default",9999,1,"base"
編輯:我也嘗試做line = line.TrimEnd(' ');
但這給了我錯誤,因為它是一個“ foreach迭代變量”,所以無法分配“行”。
更改:
line.TrimEnd(' ');
sw.WriteLine(line);
至:
sw.WriteLine(line.TrimEnd(' '));
TrimEnd
不會直接編輯字符串-它會返回應用了編輯的新字符串。
這里發生兩件事。 首先,您要修剪字段末尾而不是line末尾的空白區域。 您將在這里使用CSV解析器- 請參閱此問題 。 (不要試圖簡單地以逗號分隔行,否則會遇到各種各樣的問題)。
其次,就像其他人提到的那樣, String.TrimEnd()
不會使字符串發生變異,而是返回一個新的字符串。 在字符串字段值上使用此功能,然后重寫CSV內容。
您可以使用TextFieldParser
讀取數據,修剪每個字段。 如果字段包含定界符,那么您必須做一些額外的工作才能用引號將字段寫回來。
添加對Microsoft.VisualBasic.dll的引用
using Microsoft.VisualBasic.FileIO;
void Main()
{
var inputFilename = @"G:\Test\TestCsv.csv";
var outputFilename = @"G:\Test\TestCsvOut.csv";
using (var tfp = new TextFieldParser(inputFilename))
using (var strm = new StreamWriter(outputFilename))
{
tfp.Delimiters = new string[] { "," };
tfp.HasFieldsEnclosedInQuotes = true;
tfp.TextFieldType = FieldType.Delimited;
tfp.TrimWhiteSpace = true;
while (!tfp.EndOfData)
{
string[] fields = tfp.ReadFields();
//Add quotes to fields that contain commas
for (int i = 0; i < fields.Length; i++)
{
if (fields[i].Contains(","))
{
fields[i] = $"\"{fields[i]}\"";
}
}
//string.Join to create a delimited string
strm.WriteLine(string.Join(",", fields));
}
}
}
正如另一位用戶所提到的,如果文本本身包含逗號,則逗號分隔可能是一個問題。 但是,如果不這樣做,那么這種簡單的方法就足夠且容易了:
只需使用上String.Split() ,
打破了你的行成字段,然后修剪各一個,如圖所示做修剪的各個字段中輸入您的操作:
char[] delims = {','}; // the split delimiter
string trimmedField = ""; // holds a single trimmed field
string[] allLines = File.ReadAllLines(path);
using (StreamWriter sw = new StreamWriter(path))
{
foreach (string line in allLines)
{
if (!string.IsNullOrEmpty(line) && line.Length > 1)
{
string[] fields = line.Trim().Split(delims); // split it
foreach(string f in fields)
{
trimmedField = f.Trim(); // trim this field
//... do your thing here...
}
如果您實際上不需要拆分字符串,只需刪除所有出現的尾隨空格,則可以使用與此類似的方法
string[] allLines = {
"\"Lorem ipsum dolor sit amet\",\"Default \",9999,1,\"base \"",
"\"Lorem ipsum dolor sit amer \",\"Defaulr \",9999,1,\"baser \"" };
for(int i=0;i<allLines.Length;i++)
{
allLines[i]= allLines[i].Replace(" \"","\"");
}
console.WriteLine(allLines);
如果尾隨空格可能不止一個,請將“ Replace
包裹在while循環中
while(allLines[i].Contains(" \""))
allLines[i]= allLines[i].Replace(" \"","\"");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.