列表<list> </list>的CSV文件值

时间:2015-04-16 14:54:29

标签: c# list csv

我有一个CSV文件,我想要一些值。一个问题是我不知道文件有多少列。每次获得新的CSV文件时,该数字可能会有所不同。它将始终包含具有值的列和行。我将从普通的excel文件中获取它。

我希望该方法返回List<List>

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

在ListA里面我想要这样的人名单:

ListA [FirstName] = List1 (Zlatan,Lionel,Anders .....)

ListA [LastName] = List2 (Ibrahimovic,Messi,Svensson .....)..等等。

3 个答案:

答案 0 :(得分: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<string[]> stringArraylist;,然后将String.Split() - 方法的结果添加到其中。

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

这更像你想要的吗?

答案 1 :(得分:0)

有很多关于SO的问题涉及解析CSV文件。在这里查看一个:Reading CSV files in C#。我相当确定.NET内置了一些解决方案,但我现在还不记得它们是什么。 (@ZoharPeled建议TextFieldParser

大多数解析解决方案都为您提供了行集合,其中每个项目都是列的集合。所以假设你有类似IEnumerable<IList<string>>的东西,你可以创建一个类并使用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();
    }
}

答案 2 :(得分:0)

我终于得到了一个解决方案,它为我工作。我的朋友为他做了所有信条。 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;
    }