8

CSV 文字列に書き込みたいリストがあります。

私が見つけた例はすべて単一のアイテムリストのようで、私のものには複数のアイテムがあります。

私が現在持っているコードは次のとおりです。

private static string CreateCSVTextFile<T>(List<T> data, string seperator = ",") where T : ExcelReport, new()
{
  var objectType = typeof(T);
  var properties = objectType.GetProperties();
  var currentRow = 0;
  var returnString = "";
  foreach (var row in data)
  {
    var currentColumn = 0;
    var lineString = "";
    foreach (var info in properties)
    {
      lineString = lineString + info.GetValue(row, null) + seperator;
      currentColumn++;
    }
    if (seperator != "")
    {
      lineString = lineString.Substring(0, lineString.Count() - 2);
    }
    returnString = returnString + Environment.NewLine + lineString;
    currentRow++;
  }
  return returnString;
}

しかし、リストが大きい場合、このメソッドの実行には非常に長い時間がかかります。

私のリストが基づいているクラスは次のようになります。

internal class ClientMasterFile
{
public String COL1{ get; set; }
public String COL2{ get; set; }
public String COL3{ get; set; }
public String COL4{ get; set; }
public String COL5{ get; set; }
public String COL6{ get; set; }
public String COL7{ get; set; }
public String COL8{ get; set; }
public String COL9{ get; set; }
public String COL10{ get; set; }
public String COL11{ get; set; }
public String COL12{ get; set; }
}

String.Join の高度なバージョンを使用してこれを行うより高速な方法はありますか?

ありがとう

4

2 に答える 2

20

メソッドは、 と を使用して簡略化できStringBuilderますstring.Join

文字列を直接連結するのは遅く、大量のメモリを使用しますが、小さな操作には問題ありません。

参照: StringBuilder は文字列連結よりも多くのメモリを使用しますか?

private static string CreateCSVTextFile<T>(List<T> data, string seperator = ",")
{
    var properties = typeof(T).GetProperties();
    var result = new StringBuilder();

    foreach (var row in data)
    {
        var values = properties.Select(p => p.GetValue(row, null));
        var line = string.Join(seperator, values);
        result.AppendLine(line);
    }

    return result.ToString();
}

CSV のより完全な実装:

private static string CreateCSVTextFile<T>(List<T> data)
{
    var properties = typeof(T).GetProperties();
    var result = new StringBuilder();

    foreach (var row in data)
    {
        var values = properties.Select(p => p.GetValue(row, null))
                               .Select(v => StringToCSVCell(Convert.ToString(v)));
        var line = string.Join(",", values);
        result.AppendLine(line);
    }

    return result.ToString();
}

private static string StringToCSVCell(string str)
{
    bool mustQuote = (str.Contains(",") || str.Contains("\"") || str.Contains("\r") || str.Contains("\n"));
    if (mustQuote)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("\"");
        foreach (char nextChar in str)
        {
            sb.Append(nextChar);
            if (nextChar == '"')
                sb.Append("\"");
        }
        sb.Append("\"");
        return sb.ToString();
    }

    return str;
}

使用:トリッキーな文字列を CSV 形式にエスケープする

于 2013-07-17T11:17:18.870 に答える
0

linqtocsv を使用してある程度の成功を収めました

https://linqtocsv.codeplex.com

ここにいくつかの説明があります

http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library

于 2013-07-17T11:16:39.823 に答える