【问题标题】:CSV-file values to List<List>CSV 文件值到 List<List>
【发布时间】:2015-04-16 14:54:28
【问题描述】:

我有一个 CSV 文件,我想从中获取一些值。一个问题是我不知道文件有多少列。每次我得到一个新的 CSV 文件时,这个数字都可能不同。它总是有带有值的列和行。我将从普通的 excel 文件中获取它。

我希望该方法返回一个List&lt;List&gt;

ListA(FirstName、LastName、PhoneNumber...等等)这里我不知道 ListA 会有多少项。每次都可能不同。

在 ListA 中,我想要这样的人员列表:

ListA[FirstName] = List1(兹拉坦、莱昂内尔、安德斯.....)

ListA[LastName] = List2(伊布拉希莫维奇、梅西、斯文森.....)......等等。

【问题讨论】:

  • 有很多方法可以做到这一点..你需要做更多的研究来看看如何创建一个类,还要看看如何使用Split()方法..看看如何要在List&lt;T&gt; 方面使用泛型,请付出更多努力..没有你至少展示你尝试过的东西,没有人会给你答案或帮助..
  • 使问题更清晰,语法固定。
  • 我很抱歉这个不好的帖子。我很高兴你们能帮到我。我从朋友那里得到了解决方案并发布了。我还是应该更新问题吗?

标签: c# list csv


【解决方案1】:

你可以创建一个类 Person

class person {
    private string FirstName;
    private string LastName;
    // others
}

Open the File 并使用String.Split() 方法拆分文件中的每一行,然后转换每个值并创建对象,您可以将其添加到列表中。

List<Person> persons = new List<Person>();
persons.Add(personFromFile);

这是一个非常简短的解决方案,但它确实有效

编辑:每行的变量字段

如果是这种情况,您可以使用List&lt;string[]&gt; stringArraylist;,然后将String.Split()-Method 的结果添加到其中。

List<string[]> stringArraylist;
stringArraylist = new List<string[]>();
stringArraylist.Add("Andrew;Pearson;...;lololo;".Split(';'));

这是你想要的更多吗?

【讨论】:

  • 我认为 OP 的漏洞在于他知道他将获得多少列,因此您的解决方案不适合他的问题。
  • 我支持你。 .csv 有多少列可能并不重要?他应该将 .csv 解析到他的对象中并忽略多余或缺少的列。
  • 所以他可以简单地将 String.Split()-Method 返回的数组放在 List&lt;string[]&gt; stringArraylist; 的一侧 - 查找编辑
  • @JasonWilliams U 对,或者他在编辑中这样做。取决于用例。
  • 我会使用 List> 来简化查找并避免处理数组长度的问题。
【解决方案2】:

有很多关于解析 CSV 文件的问题。请参阅此处:Reading CSV files in C#。我相当肯定.NET 中内置了一些解决方案,尽管我现在不记得它们是什么。 (@ZoharPeled 建议TextFieldParser

大多数解析解决方案都会为您提供行集合,其中每个项目都是列的集合。所以假设你有类似IEnumerable&lt;IList&lt;string&gt;&gt; 的东西,你可以创建一个类并使用 LINQ 查询来获得你需要的东西:

public class CSVColumns 
{
    public IEnumerable<IList<string>> CSVContents { get; private set; }

    public CSVColumns(IEnumerable<IList<string>> csvcontents)
    {
        this.CSVContents = csvcontents;
    }

    public List<string> FirstNames
    {
        get { return GetColumn("FirstName"); }
    }

    public List<string> LastNames
    {
        get { return GetColumn("LastName"); }
    }

    /// <summary>
    /// Gets a collection of the column data based on the name of the column
    /// from the header row.
    /// </summary>
    public List<string> GetColumn(string columnname) 
    {
        //Get the index of the column with the name
        var firstrow = CSVContents.ElementAtOrDefault(0);

        if (firstrow != null)
        {
            int index = -1;
            foreach (string s in firstrow)
            {
                index++;
                if (s == columnname)
                {
                    return GetColumn(index, true);
                }
            }
        }

        return new List<string>();
    }

    /// <summary>
    /// Gets all items from a specific column number but skips the
    /// header row if needed.
    /// </summary>
    public List<string> GetColumn(int index, bool hasHeaderRow = true) 
    {
        IEnumerable<IList<string>> columns = CSVContents;

        if (hasHeaderRow)
            columns = CSVContents.Skip(1);

        return columns.Select(list =>
            {
                try
                {
                    return list[index];
                }
                catch (IndexOutOfRangeException ex)
                {
                    return "";
                }
            }
        ).ToList();
    }
}

【讨论】:

    【解决方案3】:

    我终于找到了一个解决方案,它对我有用。我的朋友把这一切都变成了他的信条。 stackoverflow 上没有用户,所以我将其发布。

        private List<Attributes> LoadCsv()
        {
            string filename = @"C:\Desktop\demo.csv";
            // Get the file's text.
            string whole_file = System.IO.File.ReadAllText(filename);
    
            // Split into lines.
            whole_file = whole_file.Replace('\n', '\r');
            string[] lines = whole_file.Split(new char[] { '\r' },
                StringSplitOptions.RemoveEmptyEntries);
    
            // See how many rows and columns there are.
            int num_rows = lines.Length;
            int num_cols = lines[0].Split(';').Length;
    
            // Allocate the data array.
            string[,] values = new string[num_rows, num_cols];
    
            // Load the array.
            for (int r = 0; r < num_rows; r++)
            {
                string[] line_r = lines[r].Split(';');
                for (int c = 0; c < num_cols; c++)
                {
                    values[r, c] = line_r[c];
                }
            }
    
            var attr = new List<Attributes>();
            for (var r = 0; r < num_rows; r++)
            {
                if (r == 0)
                {
                    for (var c = 0; c < num_cols; c++)
                    {
                        attr.Add(new Attributes());
                        attr[c].Name = values[r, c];
    
                        attr[c].Value = new List<String>();
                    }
                }
                else
                {
                    for (var b = 0; b < num_cols; b++)
                    {
                        var input = values[r, b];
                        attr[b].Value.Add(input);
                    }
                }
            }
            // Return the values.
            return attr;
        }
    

    【讨论】:

      猜你喜欢
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2013-11-03
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多