用csvhelper写一个空格分隔的文件

时间:2019-12-03 17:54:52

标签: csvhelper

我在CsvHelper中没有看到此选项,但是此库是否支持空格分隔符,以便每个字段都有预定数量的字符,例如空格或句点?

示例:名字-len:10姓氏-len:15会以句点翻译为

john......doe............
sam.......simpson........

2 个答案:

答案 0 :(得分:0)

CsvHelper当前不支持固定宽度的文件。有一个开放功能要求添加固定宽度支持,但我认为没有任何计划很快实现。 https://github.com/CsvHelperContrib/CsvHelperContrib/issues/2

如果您正在编写固定宽度的文件,这应该可以工作。我没有办法读取固定宽度的文件。

public class Program
{
    public static void Main(string[] args)
    {     
        var records = new List<Foo>
        {
            new Foo { FirstName = "john", LastName = "doe" },
            new Foo { FirstName = "sam", LastName = "simpson"}
        };

        using (CsvWriter csv = new CsvWriter(Console.Out))
        {
            csv.Configuration.RegisterClassMap<FooMap>();
            csv.Configuration.HasHeaderRecord = false;
            csv.Configuration.Delimiter = "";
            csv.Configuration.ShouldQuote = (field, context) => false;
            csv.WriteRecords(records);
        }

        Console.ReadLine();
    }
}

public class Foo
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public sealed class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.FirstName).TypeConverter(new FixedWidthOutput(10, '.'));
        Map(m => m.LastName).TypeConverter(new FixedWidthOutput(15, '.'));
    }
}

public class FixedWidthOutput : DefaultTypeConverter
{
    private readonly int _fieldLength;
    private readonly char _paddingCharacter;

    public FixedWidthOutput(int fieldLength, char paddingCharacter = ' ')
    {
        _fieldLength = fieldLength;
        _paddingCharacter = paddingCharacter;
    }

    public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        return value.ToString().PadRight(_fieldLength, _paddingCharacter);
    }
}

答案 1 :(得分:0)

我知道它已经回答了,但是我发布我的方法只是为了将其保存在记录中,以及另一种可能的选择。

我使用了getter方法。 所以我的课看起来像这样。

public class MyTrailer
{
    private string trailerText;

    public string TrailerText
    {
        get
        {
            var retValue = "TotalRecords=";
            retValue = retValue + trailerText.PadLeft(14, '0');
            return retValue;
        }
        set { trailerText = value; }
    }
  }

在CSV编写器上,

csv.WriteRecordsAsync
                    (new List<MyTrailer> { new MyTrailer { TrailerText = recordCount } });