我的csv文件看起来像
Metals:,E10
Al,0.1906
Ca,0.1132
Co,0.01951
Cu,0.5824
Cu,0.02383
Fe,0.03828
K,0.09577
Li,0.03024
Mg,0.007145
Na,0.1833
Ni,0.3236
Pb,0.0005787
Ti,0.4931
Tl,0.001887
Zn,0.07644
GLot,id,Slot,Scribe,Diameter,MPD,SResistivity,SThickness,TTV,LTV,Warp,Bow,S_U_A,Ep,Epi_L,Epi_Layer,Epi_Layer_2,EThick,E2thick,E2Dope,E2DopeT,E2DopeMax,E2DopeMin
31075046-001,XFB-LE00674.CP10023+001-12,1,22C1285,149.98,0,0.0217,334.71,1.91,1.03,5.35,-0.91,99.590582,1.0,1.0E18,9.8,1.12,9.9,9.6,9926193600000000,4.5574,10834500800000000,9551876800000000
我的代码看起来像这样:
namespace CsvHelperTest
{
class CsvHelperTester
{
static void Main(string[] args)
{
var csvConfig = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
HeaderValidated = null,
IgnoreBlankLines = true,
MissingFieldFound = null,
AllowComments = true,
Comment = ';',
Delimiter = ",",
TrimOptions = TrimOptions.Trim,
PrepareHeaderForMatch = header => Regex.Replace(header.Header, ",", "\n"),
};
using (var streamReader = new StreamReader("C:\\Users\\eyoung\\Desktop\\parse test files\\XFB-1C2002A_62152_CoA.csv"))
{
using (var csvReader = new CsvReader(streamReader, csvConfig))
{
for (var i = 0; i < 1; i++)
{
csvReader.Read();
}
var records = csvReader.GetRecords<EpiDataNames>().ToList();
var table = records[0];
records.RemoveAt(0);
var columns = records;
using (var writer = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
{
//writer.WriteField(records[0].Type);
//writer.NextRecord();
//records.RemoveAt(0);
//foreach (var item in records.Select(r => r.Type))
//{
// writer.WriteField(item);
//}
//writer.NextRecord();
//foreach (var item in records.Select(r => r.Value))
//{
// writer.WriteField(item);
//}
//writer.NextRecord();
}
}
}
}
public class EpiDataNames
{
[Index(0)]
public string Type { get; set; }
[Index(1)]
public string Value { get; set; }
}
}
}
这是伟大的,因为它采取的第一组数据,并使他们成为2列,'类型'和'价值',然而,问题出现时,第二组数据显示,有没有一种方法,我只能读取第一块数据?当我试图省略最后那些头时,它表现得很奇怪,并删除了第一个数据块。
for (var i = 0; i < 1; i++)
{
csvReader.Read(); //this skips the first line of data
}
for (var i = 0; i > 18; i++)
{
csvReader.Read(); //I thought this would skip the last lines of data, but it doesn't.
}
第二个标题块的问题是标题阅读像
| 类型|价值|
| - -----|- -----|
| GLot|身份证|
当它应该是,
| 类型|价值|
| - -----|- -----|
| 格洛特|31075046-001|
有什么想法吗?我对这个很迷茫,我也应该序言,我没有事先编辑这个csv文件的控制权。
3条答案
按热度按时间cyej8jka1#
如果你只想读取第一个数据块,你的代码可以非常简单。
您还可以选择设置
IgnoreBlankLines = false
,然后使用空行作为断点。对于这两种解决方案,在读取第一个数据块之后,可以读取第二个数据块。我看到的阅读第二个块的唯一潜在问题是,如果保留默认值
HasHeaderRecord = true
,则会丢失作为头的第一行数据Metals:,E10
,但如果将其设置为false
,则无法读取第二个数据块的头。wsxa1bj12#
您的文本文件由两个单独的CSV表组成,表头由空行分隔。可以使用CsvHelper读取这样的文件,但是您需要手动逐行读取,并跟踪一个表结束和新表开始的时间。然后,当一个新表开始时,您将需要引入一些启发式方法来确定它是哪种类型的表。
下面的方法
CsvExtensions.ReadTwoTableCsv()
是一种方法:然后,如果您的两个数据模型看起来像:
您将能够将CSV文件读入
List<EpiDataNames>
和List<Model2>
,如下所示:注意事项:
HeaderMatchesFirstMember(ClassMap map, CsvReader reader)
(EpiDataNames
或Model2
)相当粗糙。我查看第一个Map模型成员的列名--"Metals:"
或"GLot"
--是否出现在当前的头列表中。这是因为两个名字不同。如果名字相同,比如"Id"
和"Id"
,就需要使用更聪明的算法演示小提琴here。
cqoc49vn3#
尝试以下操作: