2017-11-07 25 views
1

異なるレコード形式があるCSVファイルを読み込んでいます。行数が異なるcsvファイル

最初のレコードには常に3つの列があります。それはヘッダーです。

他のレコードは可変数の列を持ちます。

セパレータはパイプです。 列の長さは固定です(各列の種類は固定長です)。

私はFileHelpersでCSVファイルのこのタイプを解析しようとしている:

*|060318|4  
1|Tom  |2 |605212999|02|663790000|02|T3_1018_RM |0 
2|Steve |2 |605212999|02|663790000|02|T3_1018_RM |0 
3|Bob  |1 |605212999|02|T3_1018_RM |0 

CSVの列:

ID|Name|Telephones Count|TelephoneNumber|TypeTelephone...|IDType|ProductType 

1号線と2持っ電話2台(数およびタイプ):

 605212999|02 
    663790000|02 

回線3には電話機1台(番号とタイプ):

 605212999|02 

FileHelpersまたは別の汎用コードを使用できますか?

私はこのような類似してみてください:

StreamReader sr = new StreamReader(filename); 
var csvList = new List<string[]>(); 
while(!sr.EndOfStream) 
{ 
    String[] header = sr.ReadLine().Split('|'); 
    csv.Add(header); 
} 

FileHelpersを使用してFixedLengthRecordが適用されません。どちらも

[FixedLengthRecord()] 
public class Customer 
{ 
    [FieldFixedLength(1)] 
    public int Id; 

    [FieldFixedLength(8)] 
    [FieldTrim(TrimMode.Both)] 
    public string Name; 

    [FieldFixedLength(2)] 
    [FieldTrim(TrimMode.Both)] 
    public int TelephoneCount; 

    .... 
    public string Phone1; 
    public byte Phone1Type; 

    public string Phone2; 
    public byte Phone2Type; 

    ... 
    public string Phone9; 
    public byte Phone9Type; 

    [FieldFixedLength(14)] 
    [FieldTrim(TrimMode.Both)] 
    public string IDType; 

    [FieldFixedLength(1)] 
    public int ProductType; 
} 

またはhttp://www.filehelpers.net/example/QuickStart/ReadWriteRecordByRecord/を使用して可変長レコードで使用することができます

答えて

1

FileHelpersを適用。固定長の属性は次のようになります。それは実際のデータとして、あなたの区切り文字を扱うだろうと私はかかわらず、固定長のアプローチを使用することはありません

[FixedLengthRecord(FixedMode.AllowLessChars)] 

。ので、代わりにあなたが使用できます。

[DelimitedRecord("|")] 
public class Customer 
{ 
    public int CustId { get; set; } 

    [FieldTrim(TrimMode.Right)] 
    public string Name { get; set; } 

    [FieldConverter(ConverterKind.Date, "ddMMyyyy")] 
    public DateTime AddedDate { get; set; } 

    [FieldOptional] // <-- 
    public string OptionalColumn { get; set; } 

    [FieldOptional] // <-- 
    public string OtherOptionalColumn { get; set; } 
} 

サンプルデータで:

StringBuilder data = new StringBuilder(); 
data.AppendLine("12345|PETE PETERSON     |01012001"); 
data.AppendLine("54321|SUSAN SMITH     |11112011|Hello"); 
var customers = new FileHelperEngine<Customer>().ReadString(data.ToString()); 
+0

が多くoptionalcolumnsあります。サンプル: '必須列1、OptionalColumn1、OptionalColumn 2、...、OptionalColumn N、Required Column 2、Required Column 3' – Kiquenet

+0

@Kiquenetオプション列のプロパティには、追加する限り任意の名前を付けることができますその前に '[FieldOptional]'属性があります。更新された回答を参照してください。 –

+0

***電話番号***を含む列があります。たとえば、*** 2 ***の値は、次の列はテレフォン番号で、telephone_( '01、02 for mobile')と入力します。例: '| 2 | 605212115 | 02 | 663794042 | 02 |' – Kiquenet

関連する問題