Генерация строки CSV для различных 3rd party утилит


Я генерации строки CSV для различных 3rd party утилит и эта часть кода повторяется во многих классах. Есть ли лучший способ для создания этой строки?

public override string CsvString()
{
    return (
        string.Format("\u0022{0}\u0022,\u0022{1}\u0022,\u0022{2}\u0022,\u0022{3}\u0022,\u0022{4}\u0022,\u0022{5}\u0022,\u0022{6}\u0022,\u0022{7}\u0022,\u0022{8}\u0022,\u0022{9}\u0022,\u0022{10}\u0022,\u0022{11}\u0022,\u0022{12}\u0022,\u0022{13}\u0022",

        this.BlockType,         //  1, A_NAME
        this.Tag,               //  2, A_TAG
        this.Description,       //  3, A_DESC
        this.InitialScan,       //  4, A_ISCAN
        this.AutoManual,        //  5, A_SCAN
        this.ScanTime,          //  6, A_SCANT
        this.IoDevice,          //  7, A_IODV
        this.IoAddress,         //  8, A_IOAD
        this.InitialAmStatus,   //  9, A_IAM
        this.AlarmPriority,     // 10, A_PRI
        this.AlarmEnable,       // 11, A_ENAB
        this.EnableOutput,      // 12, A_EOUT
        this.HistDescription,   // 13, A_HIST_DESC
        this.SecurityArea1      // 14, A_SECURITYAREA1
    ));
}


1835
21
задан 19 января 2011 в 10:01 Источник Поделиться
Комментарии
3 ответа

Я сомневаюсь, что вы найдете способ не перечислять все эти свойства без использования отражения, но помогает устранить эту огромную строку формата, которая может стать источником ошибки.

var properties = new Object[]
{
this.BlockType, // 1, A_NAME
this.Tag, // 2, A_TAG
this.Description, // 3, A_DESC
this.InitialScan, // 4, A_ISCAN
this.AutoManual, // 5, A_SCAN
this.ScanTime, // 6, A_SCANT
this.IoDevice, // 7, A_IODV
this.IoAddress, // 8, A_IOAD
this.InitialAmStatus, // 9, A_IAM
this.AlarmPriority, // 10, A_PRI
this.AlarmEnable, // 11, A_ENAB
this.EnableOutput, // 12, A_EOUT
this.HistDescription, // 13, A_HIST_DESC
this.SecurityArea1 // 14, A_SECURITYAREA1
}.Select(x => String.Format("\u0022{0}\u0022", x));

return String.Join(",", properties);

Пару вещей на заметку:

Это вряд ли эффективный способ сделать это, но предлагает довольно простой в сопровождении код. Если у вас есть дополнительная собственность, просто добавьте его в массив.

Это будет работать только в .Net версии 4.0. В предыдущих версиях, вам придется вызвать метод toArray() после вызова выберите.

19
ответ дан 20 января 2011 в 07:01 Источник Поделиться

Использовать то StringBuilder:

sbuilder.AppendFormat("\u0022{0}\u0022,\u0022{1}\u0022,\u0022{2}\u0022,\u0022{3}\u0022,\u0022{4}\u0022,\u0022{5}\u0022,\u0022{6}\u0022,\u0022{7}\u0022,\u0022{8}\u0022,\u0022{9}\u0022,\u0022{10}\u0022,\u0022{11}\u0022,\u0022{12}\u0022,\u0022{13}\u0022",
this.BlockType, // 1, A_NAME
this.Tag, // 2, A_TAG
this.Description, // 3, A_DESC
this.InitialScan, // 4, A_ISCAN
this.AutoManual, // 5, A_SCAN
this.ScanTime, // 6, A_SCANT
this.IoDevice, // 7, A_IODV
this.IoAddress, // 8, A_IOAD
this.InitialAmStatus, // 9, A_IAM
this.AlarmPriority, // 10, A_PRI
this.AlarmEnable, // 11, A_ENAB
this.EnableOutput, // 12, A_EOUT
this.HistDescription, // 13, A_HIST_DESC
this.SecurityArea1 // 14, A_SECURITYAREA1
).AppendLine();

10
ответ дан 19 января 2011 в 11:01 Источник Поделиться

Может, что-то вроде этого:

public static string MakeCsvLine(params string[] items)
{
return String.Format("\u0022{0}\u0022",String.Join("\u0022,\u0022",items));
}

Редактировать:

Думать об этом может быть лучше, чтобы использовать его для построения строкового разработчика так:

public static void AddCsvLine(StringBuilder sb, params string[] items)
{
sb.AppendFormat("\u0022{0}\u0022",String.Join("\u0022,\u0022",items))
.AppendLine();
}

Это сняло бы иметь длинные строки повторяются по всему коду.
Правка: сделал фунции вернуть оригинальный результат.

6
ответ дан 20 января 2011 в 03:01 Источник Поделиться