我需要从.csv文件中读取数据,并以下列格式将标题和内容存储在我的对象中。下面提到的课程列表。
public class MappingData
{
private string ColumnName { get; set; }
private List<string> Data { get; set; }
}
例如,假设我有一个如下所示的表,
| Name | Phone | City |
|:-----------|------------:|:------------:|
| Yassser | 32342342234 | Mumbai
| Sachin | 32342342234 | Surat
| Will | 32342342234 | London
因此对于上述数据,我的类应该有3个对象,第一个对象将具有以下细节
ColumnName:'名称' 数据:['Yasser','Sachin','Will']
所以,这就是我想要做的事情,以下是我的开始。我正在使用流阅读器读取文件,并用逗号分隔符分割每一行。
private List<MappingData> GetData(string filename)
{
var data = new List<MappingData>();
string fullPath = GetFilePath(filename);
StreamReader reader = new StreamReader(fullPath);
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if (!String.IsNullOrWhiteSpace(line))
{
string[] values = line.Split(',');
}
}
return data;
}
有人可以帮我把这些数据塑造成所需的格式。感谢。
答案 0 :(得分:0)
有一个出色的库来处理CSV文件。
KentBoogard
上述第三方库很容易从CSV文件中读取内容。 我建议这样做,因为你似乎刚开始并且没有重新发明轮子。
但是,如果你想以自己的方式处理文件,这是一个有效的实现。享受
var csvData = File.ReadAllLines("d:\\test.csv");
var dataRows = csvData.Skip(1).ToList();
var csvHeaderColumns = csvData.First().Split(',').ToList();
var outputList = new List<MappingData>();
foreach (var columnName in csvHeaderColumns)
{
var obj = new MappingData { columnName = columnName, data = new List<string>() };
foreach (var rowStrings in dataRows.Select(dataRow => dataRow.Split(',').ToList()))
{
obj.data.Add(rowStrings[csvHeaderColumns.IndexOf(columnName)]);
}
outputList.Add(obj);
}
这将填充您的MappingData类。
答案 1 :(得分:0)
假设你的方法的其余部分是正确的,那么试试这个:
private List<MappingData> GetData(string filename)
{
var raw = new List<string[]>();
var data = new List<MappingData>();
string fullPath = GetFilePath(filename);
using(var reader = new StreamReader(fullPath))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if (!String.IsNullOrWhiteSpace(line))
{
raw.Add(line.Split(','));
}
}
}
Func<int, MappingData> extract =
n => new MappingData()
{
ColumnName = raw[0][n],
Data = raw.Skip(1).Select(x => x[n]).ToList(),
};
data.Add(extract(0));
data.Add(extract(1));
data.Add(extract(2));
return data;
}
您必须访问MappingData
属性。
答案 2 :(得分:0)
你应该创建一个小的int变量(或者你喜欢的bool)来确定第一行是否已经完成:
在你设置ColumnName属性的第一行和你添加到MappingData数据列表的后续行中创建你需要的每个列表对象(mpName,mpPhone,mpCity)。
然后将每个列表(mpName,mpPhone,mpCity)添加到方法的数据列表中并返回。
private List<MappingData> GetData(string filename) {
List<MappingData> data = new List<MappingData>();
int NumRow = 0;
MappingData mpName = new MappingData();
MappingData mpPhone = new MappingData();
MappingData mpCity = new MappingData();
string fullPath = GetFilePath(filename);
StreamReader reader = new StreamReader(fullPath);
while (!reader.EndOfStream) {
string line = reader.ReadLine();
if (!String.IsNullOrWhiteSpace(line)) {
string[] values = line.Split(',');
if (NumRow == 0) {
mpName.ColumnName = values[0];
mpPhone.ColumnName = values[1];
mpCity.ColumnName = values[2];
NumRow = 1;
} else {
mpName.Data.Add(values[0]);
mpPhone.Data.Add(values[1]);
mpCity.Data.Add(values[2]);
}
}
}
data.Add(mpName);
data.Add(mpPhone);
data.Add(mpCity);
return data;
}
希望这有帮助。