質問編集履歴

2 文字化け修正

lovelydai

lovelydai score 30

2017/12/12 11:29  投稿

JSONのダブルクォーテーションをReplaceしたいですがうまくできません。
こんにちは、3日目解決できずすごく困っています。
したいことは、DBにあるデータをCSVファイルに書き出したく、DB1つからエクスポート機能はできています。
問題は、DBが複数の場合ですが、JSONを作ってそのままCSVファイルに入れる仕様になっています。
例えば、RoomとRoom_assign,Room_equipmentという3つのテーブルからデータを持ってきたら、こんな感じのJSONを作り、それをコンマ区切りでCSVファイルにしたいです。
ここで、ダブルクォーテーションがある場合、それをまたダブルクォーテーションで囲んで、Room_assignとRoom_equipmentはCSVでは一つの文字列みたいに入れたいです。
```JSON
""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で変えたら、「/"」 がついてしまいます。)
```Javascript
”"1”",”"2017”",”"TEST”",
""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”"
""Null"",""Null""
```
現在、問題のコードを以下に添付します。
```Javascript
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);
```
何かいい方法がありましたらぜひ教えてください。
宜しくお願い致します。
  • JavaScript

    22718 questions

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

  • jQuery

    8958 questions

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

  • CSV

    1000 questions

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

  • JSON

    1619 questions

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

1 文字化け修正

lovelydai

lovelydai score 30

2017/12/12 11:28  投稿

JSONのダブルクォーテーションをReplaceしたいですがうまくできません。
こんにちは、3日目解決できずすごく困っています。
したいことは、DBにあるデータをCSVファイルに書き出したく、DB1つからエクスポート機能はできています。
問題は、DBが複数の場合ですが、JSONを作ってそのままCSVファイルに入れる仕様になっています。
例えば、RoomとRoom_assign,Room_equipmentという3つのテーブルからデータを持ってきたら、こんな感じのJSONを作り、それをコンマ区切りでCSVファイルにしたいです。
ここで、ダブルクォーテーションがある場合、それをまたダブルクォーテーションで囲んで、Room_assignとRoom_equipmentはCSVでは一つの文字列みたいに入れたいです。
```JSON
”"1”",”"2017”",”"TEST”",
""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”"
""Null"",""Null""
```
しかし、どうしてもダブルクォーテーションが一つしかつかないので、現在はこんな感じになっています。
room_assignとroom_equipmentオブジェクト内の全ての「”」を「””」に変えればよさそうですが、どうすればいいしょうか?もしくは、JSON.Stringifyのオプションreplacer等で処理する方法もあり得ますか?(色々やってみましたが、keyの値を修正するとエラーでしたし、replacerで変えたら、「/"」 がついてしまいます。)
```Javascript
”"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”"
```
現在、問題のコードを以下に添付します。
```Javascript
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);
```
何かいい方法がありましたらぜひ教えてください。
宜しくお願い致します。
  • JavaScript

    22718 questions

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

  • jQuery

    8958 questions

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

  • CSV

    1000 questions

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

  • JSON

    1619 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る