我有一个CSV文件,我想要一些值。一个问题是我不知道文件有多少列。每次获得新的CSV文件时,该数字可能会有所不同。它将始终包含具有值的列和行。我将从普通的excel文件中获取它。
我希望该方法返回List<List>
。
ListA (FirstName,LastName,PhoneNumber ......等)这里我不知道ListA会有多少项目。它每次都可能不同。
在ListA里面我想要这样的人名单:
ListA [FirstName] = List1 (Zlatan,Lionel,Anders .....)
ListA [LastName] = List2 (Ibrahimovic,Messi,Svensson .....)..等等。
答案 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;
}