25

asp.net Web API プロジェクトで JSON/CSV ファイルを使用しており、CSVHelperおよびServiceStack.Textライブラリを試しましたが、機能しませんでした。

配列を含む JSON ファイルは動的であり、任意の数のフィールドを持つことができます

streamreader を使用してファイルを読み取り、それを CSV ファイルに変換して、エンド ユーザーがダウンロードできるようにする必要があります。

サンプル ファイル テキスト

[{"COLUMN1":"a","COLUMN2":"b","COLUMN3":"c","COLUMN4":"d","COLUMN5":"e"},
 {"COLUMN1":"a","COLUMN2":"b","COLUMN3":"c","COLUMN4":"d","COLUMN5":"e"}]

JSON から CSV

public static string jsonStringToCSV(string content)
{
    var jsonContent = (JArray)JsonConvert.DeserializeObject(content);

    var csv = ServiceStack.Text.CsvSerializer.SerializeToCsv(jsonContent);
    return csv;
}

これは私にCSVデータをもたらしません

ここに画像の説明を入力

次に、一部のファイルはコンマまたはタブの区切り文字タイプであり、CSVHelperを使用して CSV 文字列を動的に IEnumerable に変換したい

public static IEnumerable StringToList(string data, string delimiter, bool HasHeader)
{
    using (var csv = new CsvReader(new StringReader(data)))
    {
         csv.Configuration.SkipEmptyRecords = true;
         csv.Configuration.HasHeaderRecord = HasHeader;
         csv.Configuration.Delimiter = delimiter;

         var records = csv.GetRecords();
         return records;
     }
}
4

6 に答える 6

61

Json.netを使用してDeserializeObjectでデータテーブルに解決できたので、自分の回答を投稿したいのですが、これを行うより良い方法があれば、承認済みとしてマークしません。

JSON 文字列を DataTable に変換するには

public static DataTable jsonStringToTable(string jsonContent)
        {
            DataTable dt = JsonConvert.DeserializeObject<DataTable>(jsonContent);
            return dt;
        }

CSV文字列を作るには

public static string jsonToCSV(string jsonContent, string delimiter)
        {
            StringWriter csvString = new StringWriter();
            using (var csv = new CsvWriter(csvString))
            {
                csv.Configuration.SkipEmptyRecords = true;
                csv.Configuration.WillThrowOnMissingField = false;
                csv.Configuration.Delimiter = delimiter;

                using (var dt = jsonStringToTable(jsonContent))
                {
                    foreach (DataColumn column in dt.Columns)
                    {
                        csv.WriteField(column.ColumnName);
                    }
                    csv.NextRecord();

                    foreach (DataRow row in dt.Rows)
                    {
                        for (var i = 0; i < dt.Columns.Count; i++)
                        {
                            csv.WriteField(row[i]);
                        }
                        csv.NextRecord();
                    }
                }
            }
            return csvString.ToString();
        }

Web API での最終的な使用方法

string csv = jsonToCSV(content, ",");

                HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                result.Content = new StringContent(csv);
                result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
                result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "export.csv" };
                return result;
于 2016-04-01T04:25:47.373 に答える
27

質問の解決策を報告す​​るには遅すぎるかどうかはわかりません。仕事をするためにオープンソースライブラリを調べたい場合に備えて、ここに1つがあります

Cinchoo ETL を使用すると、数行のコードで簡単に JSON を csv に変換できます

using (var r = new ChoJSONReader("sample.json"))
{
    using (var w = new ChoCSVWriter("sample.csv").WithFirstLineHeader())
    {
        w.Write(r);
    }
}

詳細/ソースについては、https://github.com/Cinchoo/ChoETLにアクセスしてください。

ナゲットパッケージ:

。ネットフレームワーク:

      Install-Package ChoETL.JSON

.NET コア:

      Install-Package ChoETL.JSON.NETStandard

サンプル フィドル: https://dotnetfiddle.net/T3u4W2

完全開示: 私はこのライブラリの作成者です。

于 2017-07-03T16:05:21.377 に答える