C# 将CSV文件行解析为对象图时出现问题

C# 将CSV文件行解析为对象图时出现问题,c#,linq,linq-to-entities,C#,Linq,Linq To Entities,以下是我的csv文件的外观: 1,couchName1,“green”,“suede” 2,couchName2,“blue”,“suede” 3,couchName3,fail,“sued” ...etc. 我需要阅读这个csv,并将每一行转换成一个coach对象图。以下是我尝试过的: public static IEnumerable<string[]> ReadCsvFile(string filePath) { IEnumerable<

以下是我的csv文件的外观:

1,couchName1,“green”,“suede”
2,couchName2,“blue”,“suede”
3,couchName3,fail,“sued”
...etc.
我需要阅读这个csv,并将每一行转换成一个coach对象图。以下是我尝试过的:

    public static IEnumerable<string[]> ReadCsvFile(string filePath)
    {
        IEnumerable<string[]> file = File.ReadLines(filePath).Select(a => a.Split(';'));
        return file;
    }


public static List<Couch> GetCouches(string csvFilePath)
{
    IEnumerable<string[]> fileRows = FileUtilities.ReadCsvFile(csvFilePath);

    if (fileRows == null) return new List<Couch>(); 
    int couchId;

    List<Couch> couches = fileRows.Select(row => new Couch
     {  
        CouchId = int.TryParse(row[0],  out couchId) ? couchId : 0,
        Name= row[1],
        Color= row[2],
        Fabric= row[3]
       }).ToList();

    return couches;
}
公共静态IEnumerable ReadCsvFile(字符串文件路径)
{
IEnumerable file=file.ReadLines(filePath).Select(a=>a.Split(“;”);
返回文件;
}
公共静态列表GetCouches(字符串csvFilePath)
{
IEnumerable fileRows=FileUtilities.ReadCsvFile(csvFilePath);
if(fileRows==null)返回新列表();
内库奇德;
列表沙发=文件行。选择(行=>新沙发
{  
CouchId=int.TryParse(行[0],出CouchId)?CouchId:0,
名称=行[1],
颜色=第[2]行,
织物=第[3]行
}).ToList();
回程沙发;
}
我在LINQ select语句的行中得到错误{“Index超出了数组的边界。”},我试图将它们解析到我的coach实例和我想要返回它们的通用列表中

解决方案:

下面是我如何让它工作,自己解决的:

public static List<Couch> GetCouches(string csvFilePath)
{
    IEnumerable<string[]> fileRows = FileUtilities.ReadCsvFile(csvFilePath);
    List<Couch> couches = new List<Couch>(); // ADDED THIS

    if (fileRows == null) return new List<Couch>(); 
    int couchId;

    // NEW LOGIC, SPLIT OUT EACH ROW'S COLUMNS AND THEN MAKE THE OBJECT GRAPH
    foreach(string[] row in fileRows)
    {
        string[] rowColumnValues = row[0].Split(',').ToArray();

        couches.Add(new Couch
                            {
                              CouchId = int.TryParse(rowColumnValues[0],  out couchId) ? couchId : 0,
                              Name= rowColumnValues[1],
                              Color= rowColumnValues[2],
                              Fabric= rowColumnValues[3]
    }

    return couches;
}
公共静态列表GetCouches(字符串csvFilePath)
{
IEnumerable fileRows=FileUtilities.ReadCsvFile(csvFilePath);
List couches=new List();//添加了这个
if(fileRows==null)返回新列表();
内库奇德;
//新逻辑,拆分每行的列,然后生成对象图
foreach(fileRows中的字符串[]行)
{
string[]rowColumnValues=行[0]。拆分(',).ToArray();
沙发。添加(新沙发)
{
CouchId=int.TryParse(rowColumnValues[0],out CouchId)?CouchId:0,
Name=rowColumnValues[1],
颜色=行列值[2],
Fabric=行列值[3]
}
回程沙发;
}

我能想到的唯一原因是fileRows中的某些行可能没有预期的四个元素。

解决了这个问题。我需要将行拆分为列


请参阅上面我的最新更新。

您的csv文件中的每一行是否都包含这4个值?您确认了吗?只需要一行的值较少…是的。它们每行都有4个值,但我想知道是否所有4个值都需要用引号括起来以使其成为字符串…您可以发布该
ReadCsvFile
meth的代码吗od?如果数据是正确的,那么这将是一个检查的好地方。@nick,发布了readcsv方法。这是为了测试,我想做的就是将其推到对象图中。我认为名称可能需要在csv中加引号,就像颜色和织物是描述一样,但实际ID是数字。所以我不确定是否有y csv文件格式正确…就引号和逗号分隔值而言。我可能也有解析问题,因为csv格式?或者我再次需要将每一行拆分到另一个数组,然后在该行的列数组上生成对象图,这基本上就是我可能缺少的?看起来您正在拆分不,实际上我认为我做错了,我需要把每一行分割成一个单独的数组,在这个数组中,我取逗号分隔的值,并将其解析为自己的值数组,然后尝试从中删除对象图。现在它正在做类似于Color=1,couchName1,“绿色”、“绒面革”代替颜色=列[3]因此,我需要为每一行设置一个列数组,并将其解析到列级别……不确定。看起来这些行可能没有按照您希望的方式进行拆分。查看您发布的ReadCsvFile代码,看起来您正在使用“;”作为分隔符进行拆分,而实际数据正在使用“,”。