[英]Wondering how to add a new column to a CSV file with existing code (C#)
[英]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 中添加缺失的列
我已經嘗試使用 C# 將 csv 文件預處理為正確的 CSV,添加缺少的列,但 Z78E6221F6393D14CED5686
該代碼甚至在表 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)));
}
}
這是我的嘗試,試圖讓它更靈活、更健壯,還允許您在數據行中插入值,同時保留 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.