我很尴尬地问这个,但我根本无法得到我想要的结果。
我有一个CSV文件,如下所示:
Col_Title_1|Col_Title_2|Col_Title_3|Col_Title_4|Col_Title_5
Value_1 | Value_2 | Value_3 | Value_4 | Value_5
我想读取这些数据并对其进行操作,如(伪代码):
var test = array.Column("Col_Title_3").Value;
我似乎无法将列配对并相应地估价。
最好使用字典或KeyValuePair吗?
这是我做过的一个很好的测试,但当然不能100%工作:
Dictionary<string, string> dict = File.ReadLines(e.FullPath).Select(line =>
line.Split('|')).ToDictionary(line => line[0], line => line[1]);
我知道我可以像这样做一个hacky / hard代码:
string lineValues = File.ReadLines(e.FullPath).ElementAt(1);
string row3 = lineValues.Split('|')[2];
string row5 = lineValues.Split('|')[4];
但是出于显而易见的原因,我不想这样做。
任何帮助将不胜感激!谢谢大家!
答案 0 :(得分:3)
你可以这样做。
var lines = File.ReadLines("test.txt");
var header = lines.First().Split('|');
var data = lines.Skip(1).First().Split('|');
var dict = new Dictionary<string, string>();
for (int i = 0; i < header.Length; i++)
{
dict.Add(header[i], data[i]);
}
Console.WriteLine("Taking Col_Title_3 -> {0}", dict["Col_Title_3"]);
foreach (var i in dict.Keys)
{
Console.WriteLine("key: {0} value: {1}",i,dict[i]);
}
或者也可以像这样填充字典
var lines = File.ReadLines("test.txt");
var header = lines.First().Split('|');
var data = lines.Skip(1).First().Split('|');
var dict = header.Select((a, i) => new { key = a, data = data[i] })
.ToDictionary(b => b.key, c => c.data);
答案 1 :(得分:1)
如果您可以使用第三方库,我强烈建议您查看CSVHelper(您可以使用nuget将其纳入您的项目)。您可以创建一个POCO(Plain Old CLR Object)来定义要映射的列,然后完成其余的工作。将使这更容易。
答案 2 :(得分:0)
实施示例
class Program
{
static void Main(string[] args)
{
string[] lines = new string[] {
"Col_Title_1|Col_Title_2|Col_Title_3|Col_Title_4|Col_Title_5", //Line 0 is Header/Columns
"Value_1|Value_2|Value_3|Value_4|Value_5" //Line 1 and so on is data records
};
string fileContent = "Col_Title_1|Col_Title_2|Col_Title_3|Col_Title_4|Col_Title_5" + Environment.NewLine +
"Value_1|Value_2|Value_3|Value_4|Value_5";
CSVTable table = new CSVTable(lines);
string firstColumnvalue = table[0]["Col_Title_1"];
Console.WriteLine(firstColumnvalue);
table = new CSVTable(fileContent);
firstColumnvalue = table[0]["Col_Title_1"];
Console.WriteLine(firstColumnvalue);
}
}
public class CSVTable
{
public CSVTable(string table)
: this(table.Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
{
}
public CSVTable(string[] lines)
{
Columns = lines[0].Split('|');
Records = lines.ToList().GetRange(1, lines.Length - 1).Select(line => new CSVRecord(line, Columns)).ToList();
}
public string[] Columns { get; private set; }
List<CSVRecord> Records { get; set; }
public CSVRecord this[int index]
{
get { return Records[index]; }
}
}
public class CSVRecord : Dictionary<string, string>
{
public CSVRecord(string line, string[] keys)
: base()
{
var lista = line.Split('|');
for (int i = 0; i < lista.Length; i++)
{
Add(keys[i], lista[i]);
}
}
}