2014-02-25 62 views
4

在這裏,我必須寫出一個文件,記錄是管道分離,使用FileHelpers和C#。很大一部分字段具有可變長度(所以,我的記錄將是[DelimitedRecord(「|」)])。但是一些字段必須有固定的長度(它們必須有填充,特定的格式等等)。FileHelpers:混合分隔和固定長度記錄

我已經搜索了一堆沒有目標如何完成。

例子:

[DelimitedRecord("|")] 
public class Customer 
{ 
    public int CustId; //variable length 

    public string Name; //variable length 

    public decimal Balance; //variable length 

    [FieldConverter(ConverterKind.Date, "dd-MM-yyyy")] 
    public DateTime AddedDate; 

    public int Code; // this one must have 10 characters with "zero-fill", like 
      // 153 must look like 0000000153 

} 

如何實現這個目標?我必須使用轉換器方法併爲此編寫我自己的轉換器嗎?

預先感謝您。

+1

呀,我只想寫一個簡單的轉換器。 'string s = Code.ToString(「D10」)'應該工作,然後'Convert.ToInt32(s)'將其轉換回來。 – Dan

+0

@丹謝謝你的線索!我會寫一個轉換器,它接收一些參數並作爲答案在這裏發佈。 –

回答

0

正如@TYY提到的,我寫我自己的「多用途」轉換器,就像這樣:



    public StringNumberCharConverter(
     string Size, 
     string PaddingChar, 
     string PaddingType, 
     string RemoveSpecialChars) 
    { 
     //implementation here 
    } 

由於FileHelpers轉換器只接受字符串指定參數時,我不得不解析對轉換器的構造函數中合適的對象的一切。

對於參數,我已經將「Size」轉換爲一個「整數」PaddingChar到一個「char」PaddingType到一個自定義填充類型枚舉(即:Padding.LEFT或Padding.RIGHT,所以如果一個「左「來自參數,我應該使用String.PadLeft()等),並將」RemoveSpecialChars「參數轉換爲布爾值(檢查轉換器是否應刪除特殊字符的標誌)。

由於我需要對象到文件的轉換,所有的轉換邏輯都是在「FieldToString」方法中實現的ConverterBase抽象方法。

1

FileHelpers有一個屬性[FieldFixedLength(xxx)],我相信這應該讓你找到你正在尋找的東西(http://filehelpers.sourceforge.net/attributes.html)。

+0

謝謝你的回答,但是FileHelpers Documentation說:「FieldFixedLength:表示記錄的長度(只有當類有FixedLengthRecord時纔有效)」,在這裏我正在處理「DelimitedRecord」。不管怎樣,謝謝你。 –

+2

好吧我找到了一個解決方案,如果你可以指定一個FieldConverter,那麼你可以指定一個將它轉換爲你想要的長度。這是我所指的http://filehelpers.sourceforge.net/example_customconv.html – TYY

+0

謝謝你的線索!我會寫一個轉換器,它接收一些參數並作爲答案在這裏發佈。 –

4

對於任何未來遇到此問題的人,下面是解決此問題的一些工作代碼。

該類是一個轉換器,FileHelper引擎將使用該轉換器將整數轉換爲一個字符串,並用0填充到構造函數中指定的大小。

public class PaddedIntConverter:ConverterBase 
{ 
    private int _size; 
    public PaddedIntConverter(int size) 
    { 
     _size = size; 
    } 

    public override object StringToField(string from) 
    { 
     return int.Parse(from); 
    } 

    public override string FieldToString(object from) 
    { 
     return from.ToString().PadLeft(_size,'0'); 
    } 
} 

該轉換器可被應用到類像這樣:

[FixedLengthRecord(FixedMode.ExactLength)] 
public class MyClass{ 
    [FieldFixedLength(7)] 
    [FieldConverter(typeof(PaddedIntConverter), 7)] 
    public int RecordCount; 
}