C# 如何在c中从csv中提取头文件#

C# 如何在c中从csv中提取头文件#,c#,.net,csv,C#,.net,Csv,我正在加载csv文件并将其拆分为c#中的两个列表。现在,我还需要使用;作为delmiter。我正在尝试使用.Skip(1)命令,但这只会跳过(显然),但我需要提取标题,并在处理完其余数据后,将其作为第一行再次添加 以下是我迄今为止所尝试的: string[] fileNames = Directory.GetFiles(@"read\", "*.csv"); for (int i = 0; i < fileNames.Length; i++) { string file = @"r

我正在加载csv文件并将其拆分为c#中的两个列表。现在,我还需要使用;作为
delmiter
。我正在尝试使用.Skip(1)命令,但这只会跳过(显然),但我需要提取标题,并在处理完其余数据后,将其作为第一行再次添加

以下是我迄今为止所尝试的:

string[] fileNames = Directory.GetFiles(@"read\", "*.csv");
for (int i = 0; i < fileNames.Length; i++)
{
    string file = @"read\" + Path.GetFileName(fileNames[i]);
    var lines = File.ReadLines(file).Skip(1);
    (List<string> dataA, List<string> dataB) = SplitAllTodataAAnddataB(lines);
    var rowLog = 0;
    foreach (var line in dataA)
    {
       // Variablen für lines
       string[] entries = line.Split(';');
       rowLog++;
       Helper.checkdataAString(entries[0].ToLower(), "abc", rowLog);
       Helper.checkdataAString(entries[1].ToLower(), "firstname", rowLog);
       Helper.checkdataAString(entries[2].ToLower(), "lastname", rowLog);
       Helper.checkdataAString(entries[4].ToLower(), "gender", rowLog);
       Helper.checkdataAString(entries[5].ToLower(), "id", rowLog);
       Helper.checkdataAString(entries[3], "date", rowLog);
       Helper.drawTextProgressBar("loaded rown", rowLog, dataA.Count());
    }
    Console.WriteLine("\nencryypting data");
    var output = new List<string>();
    foreach (var line in dataA)
    {
       try
       {
          string[] entries = line.Split(';');
          string abc = entries[0].ToLower();
          string firstName = koeln.GetPhonetics(entries[1]).ToLower();
          string lastName = koeln.GetPhonetics(entries[2]).ToLower();
          string date = entries[3];
          //Hier werden die drei vorherigen Variablen konkatiniert.
          string NVG = FirstName + "_" + LastName + "_" + BirthDate;
          string gender = entries[4].ToLower();
          string age = Helper.Left(Convert.ToString(20171027 - Convert.ToInt32(entries[3])), 2);
          string zid = Guid.NewGuid().ToString();
          string fid = entries[5].ToLower();
          rowdataA++;
          output.Add($"{abc}; {NVG}; {gender}; {age}; {zid}; {fid}");
          Helper.drawTextProgressBar("encrypted rows.", rowdataA, dataA.Count());
       }
       catch { rowdataA++; }
    }
    File.WriteAllLines(fileTest, output);
}
string[]fileNames=Directory.GetFiles(@“read\”,“*.csv”);
for(int i=0;i

我是一个新的开发人员,所以我只是在尝试,任何帮助都将不胜感激

您可以通过以下方式读取文件:

string file = @"read\" + Path.GetFileName(fileNames[i]);
var content = File.ReadLines(file);

var header = content.ElementAt(0);
var lines = content.Skip(1);

您可以通过以下方式读取文件:

string file = @"read\" + Path.GetFileName(fileNames[i]);
var content = File.ReadLines(file);

var header = content.ElementAt(0);
var lines = content.Skip(1);
答案 好了。请注意,这将返回单个字符串,而不是字符串列表。
如果希望接收字符串列表(例如,如果标题跨越两行或多行),则可以执行以下操作:

List<string> headerLines  = lines.Take(amount_of_header_lines);
List<string> contentLines = lines.Skip(amount_of_header_lines);
List headerline=行。取(表头行的金额);
列表内容行=行。跳过(标题行的数量);
简单地说,
Take(X)
获取前X项,
Skip(X)
获取除前X项之外的所有内容


脚注
  • 请注意,我首先将
    lines=File.ReadLines(File)
    放在一个单独的变量中。如果我对标题行和内容行都调用了
    File.ReadLines(File)
    (而不是使用
    lines
    变量),我会读取文件两次。现在,这对您可能并不重要,但它可能会导致性能问题,而且这是毫无意义的工作
  • 将标题行拆分为部分的逻辑与将内容行拆分为部分的逻辑相同
  • 我用了
    单曲
    。您可能希望使用
    SingleOrDefault
    (也可能不使用)。但这与另一个讨论有关,而这不是本文的重点
  • 您的代码使用简单的CSV结构,但这会很快变得非常复杂。
    • 如果要使用分号作为单元格值的一部分,请将单元格值括在引号中。例如,请注意,此数据仅表示三列:
      ColumnA;“ColumnB;StillColumnB”;C列
      。您的代码(
      line.Split(“;”)
      )不会对此进行解释
    • 表格的一行(在Excel中)可以拆分为两行(在文本编辑器中查看csv文件时)。如果单元格值中有换行符,则会发生这种情况
      File.ReadLines()
      不能解释这一点
    • 当试图为看似简单的数据格式创建解析器时;始终检查是否存在用于此的现有库不要重新发明车轮(除非是出于培训目的)。有很多您目前没有想到的边缘情况,但最终将成为您最初简单代码的死亡
  • 在无意冒犯的情况下,您的代码不是最干净的。如果您对提高质量感兴趣,我建议将此代码发布到CodeReview StackExchange(请提及您是初学者,这样您就不会被复杂的解释弄得不知所措)CodeReview只允许工作代码,因此您需要在发布之前完成它
答案 好了。请注意,这将返回单个字符串,而不是字符串列表。
如果希望接收字符串列表(例如,如果标题跨越两行或多行),则可以执行以下操作:

List<string> headerLines  = lines.Take(amount_of_header_lines);
List<string> contentLines = lines.Skip(amount_of_header_lines);
List headerline=行。取(表头行的金额);
列表内容行=行。跳过(标题行的数量);
简单地说,
Take(X)
获取前X项,
Skip(X)
获取除前X项之外的所有内容


脚注
  • 请注意,我首先将
    lines=File.ReadLines(File)
    放在一个单独的变量中。如果我对标题行和内容行都调用了
    File.ReadLines(File)
    (而不是使用
    lines
    变量),我会读取文件两次。那可能不合适
    List<string> headerLines  = lines.Take(amount_of_header_lines);
    List<string> contentLines = lines.Skip(amount_of_header_lines);
    
    var allLines = File.ReadAllLines(originalFile);
    var headerLine = allLines.First();
    var dataLines = allLines.Skip(1);
    var processedLines = ProcessLines(dataLines);
    File.WriteAllLines(newFile, (new[] {headerLine}.Concat(processedLines)).ToArray());
    
    IEnumerable<string> ProcessLines(IEnumerable<string> originalLines)
    {
        var processedLines = new List<string>();
        foreach(var line in originalLines)
        {
            var processedLine = //generate your processed line here
            processedLines.Add(processedLine);
        }
        return processedLines;
    }