在C#中解析CSV文件-跳过与两个IF条件之一不匹配的任何行

在C#中解析CSV文件-跳过与两个IF条件之一不匹配的任何行,c#,C#,我使用下面的C#代码来解析csv文件,然后将结果导出到SQL Server数据库 我试图用if语句来做的是说“如果第1列中的值为1,则以一种方式解析该行,如果第1列中的值为2,则以另一种方式解析该行…”然后我需要添加的是,在下面代码中有注释的地方,就是说“否则,只需跳过csv文件的该行。” public List ParseCsvFile(列表条目、字符串文件) { entries.removet(entries.Count-1); 条目。删除(0); 列表实体=新列表(); foreach(条

我使用下面的C#代码来解析csv文件,然后将结果导出到SQL Server数据库

我试图用
if
语句来做的是说“如果第1列中的值为1,则以一种方式解析该行,如果第1列中的值为2,则以另一种方式解析该行…”然后我需要添加的是,在下面代码中有注释的地方,就是说“否则,只需跳过csv文件的该行。”

public List ParseCsvFile(列表条目、字符串文件)
{
entries.removet(entries.Count-1);
条目。删除(0);
列表实体=新列表();
foreach(条目中的字符串行)
{
实体CsvFile=新实体();
string[]lineParts=line.Split(',');
如果(线条零件[1]=“1”)
{
标识符=$“{lineParts[2]}”;
CsvFile.SourceId=$“{lineParts[3]}”;
CsvFile.Name=$“{lineParts[5]}{lineParts[6]}{lineParts[7]}{lineParts[8]}”+
$“{lineParts[9]}{lineParts[10]}”;
实体。添加(CsvFile);
}
else if(线部件[1]=“2”)
{
标识符=$“{lineParts[11]}”;
CsvFile.SourceId=$“{lineParts[12]}”;
CsvFile.Name=$“{lineParts[13]}{lineParts[14]}{lineParts[15]};
实体。添加(CsvFile);
}
//需要把代码放在这里,上面写着“否则,跳过CSV文件的这一行。”
}
返回实体;
}
基于此,我推断您的问题至少有一部分不是因为
if
语句的语法有问题,而是因为您在数组中查找的元素根本不存在(例如,如果整行为空,或者至少没有逗号)

假设是这样,那么这种方法会更可靠(这将忽略没有第二个字段的行,以及字段不包含整数值的行,以防在某个时候遇到另一个问题):

if(lineParts.Length<2 | | |!int.TryParse(lineParts[1],out int recordType))
{
继续;
}
如果(记录类型==1)
{
标识符=$“{lineParts[2]}”;
CsvFile.SourceId=$“{lineParts[3]}”;
CsvFile.Name=$“{lineParts[5]}{lineParts[6]}{lineParts[7]}{lineParts[8]}”+
$“{lineParts[9]}{lineParts[10]}”;
实体。添加(CsvFile);
}
else if(记录类型==2)
{
标识符=$“{lineParts[11]}”;
CsvFile.SourceId=$“{lineParts[12]}”;
CsvFile.Name=$“{lineParts[13]}{lineParts[14]}{lineParts[15]};
实体。添加(CsvFile);
}
值得一提的是,像
$“{lineParts[2]}”
这样的表达式,其中
lineParts
已经是一个
string[]
是毫无意义和效率低下的。如果您只想使用特定的分隔符连接字符串值,那么
string.Join()
方法非常有用。因此,您的代码可以简化一点:

if(lineParts.Length<2 | | |!int.TryParse(lineParts[1],out int recordType))
{
继续;
}
如果(记录类型==1)
{
CsvFile.Identifier=lineParts[2];
CsvFile.SourceId=lineParts[3];
CsvFile.Name=string.Join(“,lineParts.Skip(5).Take(6));
实体。添加(CsvFile);
}
else if(记录类型==2)
{
CsvFile.Identifier=lineParts[11];
CsvFile.SourceId=lineParts[12];
CsvFile.Name=string.Join(“,lineParts.Skip(13).Take(3));
实体。添加(CsvFile);
}

最后,不要试图用自己的代码解析CSV。您实现的逻辑仅适用于最简单的CSV示例。如果您完全控制了源代码,并且可以确保该文件永远不必执行诸如引号或引号字符之类的操作,那么它就可以正常工作。但是,大多数CSV数据都来自自己无法控制的来源,确保您能够处理CSV中发现的所有变体非常重要。请参阅以获取有关如何执行此操作的详细信息。

您是否已经忽略了它?如果第一项是1或2,则处理它并将其添加到
实体中。如果不是,你也不会。我不明白问题是什么。你可以使用CsvReader并实现ShouldSkipRecord来生成条件,除此之外,
实体CsvFile
有点混乱。
Entity-Entity
不是更清楚吗?名称
CsvFile
看起来像一个类名,意味着它代表整个文件,而不是该文件中的一个实体。@艾米同意,我当然可以把它清理干净。@Stpete111这是需要讨论的非常相关的信息。发生这种情况时,
lineParts
的长度是多少?正在抛出什么特定的异常类型,以及从哪一行抛出?
 public List<Entity> ParseCsvFile(List<string> entries, string urlFile)
        {
            entries.RemoveAt(entries.Count - 1);
            entries.RemoveAt(0);
            List<Entity> entities = new List<Entity>();
            foreach (string line in entries)
            {
                Entity CsvFile = new Entity();
                string[] lineParts = line.Split(',');

                if (lineParts[1] == "1")
                {
                    CsvFile.Identifier = $"{lineParts[2]}";
                    CsvFile.SourceId = $"{lineParts[3]}";
                    CsvFile.Name = $"{lineParts[5]} {lineParts[6]} {lineParts[7]} {lineParts[8]} " +
                      $"{lineParts[9]} {lineParts[10]}";
                    entities.Add(CsvFile);
                }
                else if (lineParts[1] == "2")
                {
                    CsvFile.Identifier = $"{lineParts[11]}";
                    CsvFile.SourceId = $"{lineParts[12]}";
                    CsvFile.Name = $"{lineParts[13]} {lineParts[14]} {lineParts[15]};
                    entities.Add(CsvFile);
                }

            //Need to put code here that says "otherwise, skip this line of the CSV file."

            }
            return entities;
        }