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

C# 在c中的现有csv文件中添加新列,c#,csv,C#,Csv,我需要插入新的列到一个现有的CSV文件更新每天和管道分隔 |||||||||||||||||||||||||||||||||||||||||||||||||| |Table1||||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||||||| N|IDI |TEST|START DATE HOUR |CAUSE|K

我需要插入新的列到一个现有的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  |
||||||||||||||||||||||||||||||||||||||||||||||||||
请注意,CSV文件中表1和表2之间的列数不同

表1的列数为8

表2的列数为10

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

结束日期小时 长度 我曾尝试使用C将csv文件预处理为正确的csv,添加缺少的列,但输出不正确

该代码甚至在表2中添加了缺少的列

如何解决这个问题

下面是我的代码

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)));
    }
}

这就是我想到的。为了便于调试,我将其拆分为两个文件,但如果需要,您可以撤消它。这会在每一行中读取,一旦您遇到表2,您就打破循环。如果第一列包含N,则您在表标题中,并添加标题,如果不包含,则添加空字段

这是一个脆弱的解决方案,依赖于文件的格式不改变,但我认为它会做你想做的事情

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)));

这是我的尝试,试图使它更灵活、更健壮,还允许您在保持对齐的同时在数据行中插入值

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);
注意:它使用了一些相对较新的C特性,因此如果出现编译错误,则必须进行一些调整


还要注意的是,我没有插入返回值,您谈论的是缺少的列,但出于某种原因,请跳过该列。

这不是CSV文件。CSV文件只是具有特定格式的文本文件。它没有多个表。您发布的图像不相关-看起来您双击了该文件,希望Excel以某种方式将其显示为Excel工作表。Excel无法猜测分隔符是什么。它将尝试使用最终用户的区域设置导入该数据,例如,或;作为列表分隔符。我怀疑任何语言环境使用|如果您想要多个工作表和表格创建和读取真正的Excel文件,例如使用ePlus。xlsx格式是一个包含XML文件的zip包。像Epplus这样的库使得创建xlsx文件像调用sheet.Cells.LoadFromCollectionCustomer一样简单。这是一个由服务器生成的CSV文件,可供我处理。事实并非如此。你可以这么说,但事实并非如此。您可以查找什么是csv,甚至是定义csv的RFC,但短版本是,它应该是一个简单的文本文件,以逗号作为值分隔符。你得到的是一个文本报告,需要解析才能取回数据我什么都不说。。。对不起,数据行呢?填充物呢?此外,我不会为每一行调用Insert,为什么不将它们放在if块中呢?这会为每个数据行插入两个空列。我不知道你说的是什么意思。我为每一行插入的原因是试图在文件中保持一致的列数。@schwechel感谢您的帮助,非常感谢填充,我的意思是输出文件不再可读,因为所有列不再对齐。此外,您正在向标题行添加管道。列标题中应包含尾随空格,数据行中应包含相应的空格或值(如果有)。
||||||||||||||||||||||||||||||||||||||||||||||||||
|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  |
||||||||||||||||||||||||||||||||||||||||||||||||||