質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • JavaScript

    16471questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jQuery

    6723questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • JSON

    1158questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • CSV

    636questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JSONのダブルクォーテーションをReplaceしたいですがうまくできません。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,906

lovelydai

score 22

こんにちは、3日目解決できずすごく困っています。

したいことは、DBにあるデータをCSVファイルに書き出したく、DB1つからエクスポート機能はできています。
問題は、DBが複数の場合ですが、JSONを作ってそのままCSVファイルに入れる仕様になっています。
例えば、RoomとRoom_assign,Room_equipmentという3つのテーブルからデータを持ってきたら、こんな感じのJSONを作り、それをコンマ区切りでCSVファイルにしたいです。
ここで、ダブルクォーテーションがある場合、それをまたダブルクォーテーションで囲んで、Room_assignとRoom_equipmentはCSVでは一つの文字列みたいに入れたいです。

""1"",""2017"",""TEST"",
"{""room_assign"":[{""week_idx"":""1"",""period_idx"":""1""},{""week_idx"":""2"",""period_idx"":""2""}]}",
"{""room_equipment"":[{""equipment_idx"":""1""},{""equipment_idx"":""2""}]}",
""Null"",""Null""

しかし、どうしてもダブルクォーテーションが一つしかつかないので、現在はこんな感じになっています。
room_assignとroom_equipmentオブジェクト内の全ての「”」を「””」に変えればよさそうですが、どうすればいいしょうか?もしくは、JSON.Stringifyのオプションreplacer等で処理する方法もあり得ますか?(色々やってみましたが、keyの値を修正するとエラーでしたし、replacerで変えたら、「/"」 がついてしまいます。)

""1"",""2017"",""TEST"",
"{"room_assign":[{"week_idx":"1","period_idx":"1"},{"week_idx":"2","period_idx":"2"}]}",
"{"room_equipment":[{"equipment_idx":"1"},{"equipment_idx":"2"}]}",
""Null"",""Null""

現在、問題のコードを以下に添付します。

 for(var key in data.result.rooms)
     {
                contents[key] = [];    //配列の要素数を指定する
                // オブジェクト値を文字列に変換する。

                            var room_idx = data.result.rooms[key].room_idx;
                            var year = data.result.rooms[key].year;
                            var customer_idx = data.result.rooms[key].customer_idx;
                            var room_code = data.result.rooms[key].room_code;
                            var room_name = data.result.rooms[key].room_name;
                            var facility_idx = data.result.rooms[key].facility_idx;
                            var capacity = data.result.rooms[key].capacity;
                            var memo = data.result.rooms[key].memo;
                            var is_used = data.result.rooms[key].is_used;
                            var room_assign = [];
                            var room_equipment = [];
                            var deleter = data.result.rooms[key].deleter;
                            var deleted = data.result.rooms[key].deleted;

                            // loop room_assigns with _idxs
                            for(var assign_key in data.result.room_assigns)
                            {
                                var target_customer_idx = data.result.room_assigns[assign_key].customer_idx;
                                var target_year = data.result.room_assigns[assign_key].year;
                                var target_room_idx = data.result.room_assigns[assign_key].room_idx;
                                var week_idx = JSON.stringify(data.result.room_assigns[assign_key].week_idx);
                                var period_idx = JSON.stringify(data.result.room_assigns[assign_key].period_idx);

                                if(customer_idx === target_customer_idx && year === target_year && room_idx === target_room_idx)
                                {
                                    room_assign.push({week_idx, period_idx});
                                }
                            }

                            // ダブルクォーテーション処理要,"を””へ、または、Stringの場合””で囲むなどなど
                            var room_assign_parse = JSON.stringify({room_assign});

                            // loop room_equipments with _idxs
                            for(var equipment_key in data.result.room_equipments)
                            {
                                var target_customer_idx = data.result.room_equipments[equipment_key].customer_idx;
                                var target_year = data.result.room_equipments[equipment_key].year;
                                var target_room_idx = data.result.room_equipments[equipment_key].room_idx;
                                var equipment_idx = JSON.stringify(data.result.room_equipments[equipment_key].equipment_idx);

                                if(customer_idx === target_customer_idx && year === target_year && room_idx === target_room_idx)
                                {
                                    room_equipment.push({equipment_idx});
                                }
                            }

                            var room_equipment_parse = JSON.stringify({room_equipment});

                            //  Insert values into contents array
                            contents[key].push(room_idx, year, customer_idx, room_code, room_name, facility_idx, capacity, memo, is_used, room_assign_parse_replace, room_equipment_parse_replace, deleter, deleted);

                            var room_parse = JSON.stringify(Object.values(contents[key]),
                            // Nullがある場合は、””に変える。                            
                                function(key, value) 
                                {
                                    if (value === null || value =='')
                                    {
                                        return '""';
                                    }
                                    else if(Number.isFinite(value))
                                    {
                                        return '"' + value + '"';
                                    }
                                    else if(typeof value === 'string')
                                    {
                                        return '"' + value + '"';
                                    }
                                    else if(typeof value === 'boolean')
                                    {
                                        return '"' + value + '"';
                                    }
                                return value;
                                }        
                            );                                
                            // 文字列配列をJSONとして加工する。
                             contents[key] = JSON.parse(room_parse);          
                        }

                        console.log("contents = ",contents);    

                        //  File APIのBlobのパラメータに投げるために形を整形する。
                        var csvContents = contents.map(function(l){return l.join(',')}).join('\r\n');
                        console.log("cvsContents = ",csvContents);


何かいい方法がありましたらぜひ教えてください。
宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • defghi1977

    2017/12/12 11:39

    おっしゃっていることが全く見えてきません. 必要としているCSVのフォーマット定義, そのCSVを生成するために必要となるJSONの対応等を整理して下さい.(JSONデータをカンマ区切りのCSVにしたい?)

    キャンセル

  • lovelydai

    2017/12/12 12:00

    質問ありがとうございます。自己解決しました。

    キャンセル

  • defghi1977

    2017/12/12 12:03

    なお, 自己解決した場合もどのように解決したかを(自分で)回答して下さい.

    キャンセル

回答 1

check解決した方法

0

自己解決しました。
stringifyで生成されたJSON文字列にReplaceを以下のようにしたら、上手く行きました。

var room_equipment_parse = JSON.stringify({room_equipment}).replace(/\"/g, '\"\"');

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16471questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jQuery

    6723questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • JSON

    1158questions

    JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

  • CSV

    636questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。