我正在使用ERP集成软件。我需要从HRM应用程序解析CSV文件以进行输入 我正在获取输入CSV文件:
$ Emp.No $ = 123456,$ CardNo $ = 254658,$ InTime $ =“12/11/2013 09:03:05”,$ OutTime $ =“12/11/2013 17:25:20”
$ Emp.No $ = 565556,$ CardNo $ = 254689,$ InTime $ =“12/11/2013 09:03:50”,$ OutTime $ =“12/11/2013 18:01:11”
CSV文件没有列名标题,而是每个字段在$FieldName$
内都有与之关联的字段名称。
我尝试用CSVHelper解析它。使用ReadFieldsByIndex()
方法时,它工作正常。
问题:
有些列没有$InTime$
或$OutTime$
。因此,按索引读取失败。如何只读取可用数据以及如何根据每行中可用的字段名称进行映射。
答案 0 :(得分:2)
你那里没有CSV文件。您有一个数据文件,每行包含一个或多个键/值对,以逗号分隔。键和值由=
分隔,键由$
括起。
表达了你所拥有的,这应该有助于你找到解决方案:
,
上的行,为您提供键值对。=
上的键值对以分为两部分。$
。然后,您应该拥有适当级别的数据,以将这些值传输到您拥有的任何目标对象中。
答案 1 :(得分:0)
这将写入带有标题的单独文件,后跟值。
string file =@"D:\STACKOVERFLOW\csvproblem.txt";
string newfile =@"D:\STACKOVERFLOW\output.txt";
StreamReader sr = new StreamReader(file);
StreamWriter sw = new StreamWriter(newfile);
try{
string header = "";
StringBuilder sb = new StringBuilder();
StringBuilder sb_header = new StringBuilder();
bool recordHeader = true;
while(sr.EndOfStream==false){
string readLine = sr.ReadLine();
string[] split = readLine.Split(',');
sb = new StringBuilder();
foreach (string str in split)
{
if (recordHeader)
{
if (str.IndexOf('$') < str.LastIndexOf('$'))
{
sb_header.AppendFormat("{0},",
str.Substring(str.IndexOf('$'),str.IndexOf('$')+str.LastIndexOf('$')+1));
}
}
sb.AppendFormat("{0},", str.Substring(str.IndexOf('=')+1));
}
if (recordHeader)
{
sw.WriteLine(sb_header.ToString().Trim(','));
}
sw.WriteLine(sb.ToString().Trim(','));
recordHeader = false;
}
}
finally{
sr.Close();
sw.Close();
}