簡體   English   中英

在 c# 的現有 csv 文件中添加新列

[英]Add new column in existing csv file in c#

我需要將新列插入到每天更新的現有 CSV 文件中,並以管道分隔

||||||||||||||||||||||||||||||||||||||||||||||||||
|Table1|||||||||||||||||||||||||||||||||||||||||||||||||            
||||||||||||||||||||||||||||||||||||||||||||||||||          
N|IDI  |TEST|START DATE HOUR    |CAUSE|KIND|NUMB|NAMES|         
1|10704|    |21/07/2020 15:05:54|L    |MT  |2786|NAV  |         
2|10660|    |21/07/2020 09:27:31|L    |MT  |4088|PIS  |     
||||||||||||||||||||||||||||||||||||||||||||||||||          
|Table2|||||||||||||||||||||||||||||||||||||||||||||||||            
||||||||||||||||||||||||||||||||||||||||||||||||||          
N|IDI  |TEST|START DATE HOUR    |END DATE HOUR      |LENGHT  |RETURNS         |CAUSE|KIND|NUMB|NAMES|           
1|10710|    |21/07/2020 19:34:00|21/07/2020 20:19:09|00:45:09| -              |L    |MT  |7806|ACC  |
2|10708|    |21/07/2020 18:28:12|21/07/2020 18:28:13|00:00:01| -              |T    |MT  |2600|LIT  |       
3|10700|    |21/07/2020 14:16:37|21/07/2020 15:19:13|01:02:36|21/07/2020 17:00|L    |MT  |4435|UHI  |       
4|10698|    |21/07/2020 14:06:45|21/07/2020 14:07:22|00:00:37|-               |B    |MT  |5789|TYK  |
5|10674|    |21/07/2020 10:21:04|21/07/2020 10:44:41|00:23:37|21/07/2020 12:30|T    |MT  |6699|FGR  |
||||||||||||||||||||||||||||||||||||||||||||||||||

注意表1和表2之間的列數在CSV文件上是不同的

對於表 1,列數為 8

對於表 2,列數為 10

我需要在表 1 和表 2 中添加缺失的列

  1. 結束日期小時
  2. 長度

我已經嘗試使用 C# 將 csv 文件預處理為正確的 CSV,添加缺少的列,但 Z78E6221F6393D14CED5686

在此處輸入圖像描述

該代碼甚至在表 2 中也添加了缺失的列

如何解決這個問題?

這是 csv 文件

我的代碼如下

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        int posNewColumn = 5;

        string output = @"C:\Downloads\import.csv";

        string[] CSVDump = File.ReadAllLines(output);
        List<List<string>> CSV = CSVDump.Select(x => x.Split('|').ToList()).ToList();
        for (int i = 0; i < CSV.Count; i++)
        {
            if (CSV[i].Count > posNewColumn)
            {
                CSV[i].Insert(posNewColumn, i == 0 ? "Headername" : "END DATE HOUR");
            }
            else
            {
                CSV[i].Add(i == 0 ? "Headername" : "END DATE HOUR");
            }
        }
        File.WriteAllLines(output, CSV.Select(x => string.Join("|", x)));
    }
}

這是我的嘗試,試圖讓它更靈活、更健壯,還允許您在數據行中插入值,同時保留 alignment。

string inputFile = @"import.csv";
string outputFile = @"output.csv";

bool startInserting = false;
string getLine(string endDateText, string lengthText) => $"{endDateText,-19}|{lengthText,-8}|";

var fileContents = File.ReadAllLines(inputFile);
for (int i = 0; i < fileContents.Length; i++)
{
    var line = fileContents[i];

    if (line.Contains("Table1"))
    {
        startInserting = true;
        continue;
    }

    if (line.Contains("Table2"))
        break;

    if (line.Length == 0 || line[0] == '|')
        continue;

    if (startInserting)
    {
        int columnIndex = 33;
        if (line[0] == 'N')
        {
            string headerLine = getLine("END DATE HOUR", "LENGHT"); // I keep the typo
            fileContents[i] = line.Insert(columnIndex, headerLine);
        }
        else if (char.IsDigit(line[0]))
        {
            string dataLine = getLine("", "");
            fileContents[i] = line.Insert(columnIndex, dataLine);
        }
    }

}

File.WriteAllLines(outputFile, fileContents);

這是 output:

||||||||||||||||||||||||||||||||||||||||||||||||||
|Table1|||||||||||||||||||||||||||||||||||||||||||||||||            
||||||||||||||||||||||||||||||||||||||||||||||||||          
N|IDI  |TEST|START DATE HOUR    |END DATE HOUR      |LENGHT  |CAUSE|KIND|NUMB|NAMES|         
1|10704|    |21/07/2020 15:05:54|                   |        |L    |MT  |2786|NAV  |         
2|10660|    |21/07/2020 09:27:31|                   |        |L    |MT  |4088|PIS  |     
||||||||||||||||||||||||||||||||||||||||||||||||||          
|Table2|||||||||||||||||||||||||||||||||||||||||||||||||            
||||||||||||||||||||||||||||||||||||||||||||||||||          
N|IDI  |TEST|START DATE HOUR    |END DATE HOUR      |LENGHT  |RETURNS         |CAUSE|KIND|NUMB|NAMES|           
1|10710|    |21/07/2020 19:34:00|21/07/2020 20:19:09|00:45:09| -              |L    |MT  |7806|ACC  |
2|10708|    |21/07/2020 18:28:12|21/07/2020 18:28:13|00:00:01| -              |T    |MT  |2600|LIT  |       
3|10700|    |21/07/2020 14:16:37|21/07/2020 15:19:13|01:02:36|21/07/2020 17:00|L    |MT  |4435|UHI  |       
4|10698|    |21/07/2020 14:06:45|21/07/2020 14:07:22|00:00:37|-               |B    |MT  |5789|TYK  |
5|10674|    |21/07/2020 10:21:04|21/07/2020 10:44:41|00:23:37|21/07/2020 12:30|T    |MT  |6699|FGR  |
||||||||||||||||||||||||||||||||||||||||||||||||||

注意:它使用了一些相對較新的 C# 功能,因此如果您遇到編譯錯誤,您將不得不進行一些調整。

另請注意,我沒有插入RETURNS ,您談論的是缺少列,但由於某種原因跳過了該列。

這就是我想出的。 我將它分成兩個文件以便於調試,但如果你願意,你可以撤消它。 這會讀入每一行,一旦你遇到“Table2”,你就會跳出循環。 如果第一列包含“N”,那么您在表 header 中並添加 header,如果沒有,則添加一個空字段。

這是一個脆弱的解決方案,它依賴於該文件的格式不會改變,但我認為它會做你想做的事。

int posNewColumn = 4;

string input = @"C:\Temp\SO\import.csv";
string output = @"C:\Temp\SO\out.csv";

string[] CSVDump = File.ReadAllLines(input);
List<List<string>> CSV = CSVDump.Select(x => x.Split('|').ToList()).ToList();
foreach (List<string> line in CSV)
{
    if (line[1] == "Table2")
    {
        break;
    }
    line.Insert(posNewColumn, line[0] == "N" ? "LENGHT" : string.Empty);
    line.Insert(posNewColumn, line[0] == "N" ? "END DATE HOUR" : string.Empty);
}

File.WriteAllLines(output, CSV.Select(x => string.Join("|", x)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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