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