簡體   English   中英

在C#中從CSV刪除尾隨空間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM