こんにちは、3日目解決できずすごく困っています。
したいことは、DBにあるデータをCSVファイルに書き出したく、DB1つからエクスポート機能はできています。
問題は、DBが複数の場合ですが、JSONを作ってそのままCSVファイルに入れる仕様になっています。
例えば、RoomとRoom_assign,Room_equipmentという3つのテーブルからデータを持ってきたら、こんな感じのJSONを作り、それをコンマ区切りでCSVファイルにしたいです。
ここで、ダブルクォーテーションがある場合、それをまたダブルクォーテーションで囲んで、Room_assignとRoom_equipmentはCSVでは一つの文字列みたいに入れたいです。
JSON
1""1"",""2017"",""TEST"", 2"{""room_assign"":[{""week_idx"":""1"",""period_idx"":""1""},{""week_idx"":""2"",""period_idx"":""2""}]}", 3"{""room_equipment"":[{""equipment_idx"":""1""},{""equipment_idx"":""2""}]}", 4""Null"",""Null""
しかし、どうしてもダブルクォーテーションが一つしかつかないので、現在はこんな感じになっています。
room_assignとroom_equipmentオブジェクト内の全ての「”」を「””」に変えればよさそうですが、どうすればいいしょうか?もしくは、JSON.Stringifyのオプションreplacer等で処理する方法もあり得ますか?(色々やってみましたが、keyの値を修正するとエラーでしたし、replacerで変えたら、「/"」 がついてしまいます。)
Javascript
1""1"",""2017"",""TEST"", 2"{"room_assign":[{"week_idx":"1","period_idx":"1"},{"week_idx":"2","period_idx":"2"}]}", 3"{"room_equipment":[{"equipment_idx":"1"},{"equipment_idx":"2"}]}", 4""Null"",""Null""
現在、問題のコードを以下に添付します。
Javascript
1 for(var key in data.result.rooms) 2 { 3 contents[key] = []; //配列の要素数を指定する 4 // オブジェクト値を文字列に変換する。 5 6 var room_idx = data.result.rooms[key].room_idx; 7 var year = data.result.rooms[key].year; 8 var customer_idx = data.result.rooms[key].customer_idx; 9 var room_code = data.result.rooms[key].room_code; 10 var room_name = data.result.rooms[key].room_name; 11 var facility_idx = data.result.rooms[key].facility_idx; 12 var capacity = data.result.rooms[key].capacity; 13 var memo = data.result.rooms[key].memo; 14 var is_used = data.result.rooms[key].is_used; 15 var room_assign = []; 16 var room_equipment = []; 17 var deleter = data.result.rooms[key].deleter; 18 var deleted = data.result.rooms[key].deleted; 19 20 // loop room_assigns with _idxs 21 for(var assign_key in data.result.room_assigns) 22 { 23 var target_customer_idx = data.result.room_assigns[assign_key].customer_idx; 24 var target_year = data.result.room_assigns[assign_key].year; 25 var target_room_idx = data.result.room_assigns[assign_key].room_idx; 26 var week_idx = JSON.stringify(data.result.room_assigns[assign_key].week_idx); 27 var period_idx = JSON.stringify(data.result.room_assigns[assign_key].period_idx); 28 29 if(customer_idx === target_customer_idx && year === target_year && room_idx === target_room_idx) 30 { 31 room_assign.push({week_idx, period_idx}); 32 } 33 } 34 35 // ダブルクォーテーション処理要,"を””へ、または、Stringの場合””で囲むなどなど 36 var room_assign_parse = JSON.stringify({room_assign}); 37 38 // loop room_equipments with _idxs 39 for(var equipment_key in data.result.room_equipments) 40 { 41 var target_customer_idx = data.result.room_equipments[equipment_key].customer_idx; 42 var target_year = data.result.room_equipments[equipment_key].year; 43 var target_room_idx = data.result.room_equipments[equipment_key].room_idx; 44 var equipment_idx = JSON.stringify(data.result.room_equipments[equipment_key].equipment_idx); 45 46 if(customer_idx === target_customer_idx && year === target_year && room_idx === target_room_idx) 47 { 48 room_equipment.push({equipment_idx}); 49 } 50 } 51 52 var room_equipment_parse = JSON.stringify({room_equipment}); 53 54 // Insert values into contents array 55 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); 56 57 var room_parse = JSON.stringify(Object.values(contents[key]), 58 // Nullがある場合は、””に変える。 59 function(key, value) 60 { 61 if (value === null || value =='') 62 { 63 return '""'; 64 } 65 else if(Number.isFinite(value)) 66 { 67 return '"' + value + '"'; 68 } 69 else if(typeof value === 'string') 70 { 71 return '"' + value + '"'; 72 } 73 else if(typeof value === 'boolean') 74 { 75 return '"' + value + '"'; 76 } 77 return value; 78 } 79 ); 80 // 文字列配列をJSONとして加工する。 81 contents[key] = JSON.parse(room_parse); 82 } 83 84 console.log("contents = ",contents); 85 86 // File APIのBlobのパラメータに投げるために形を整形する。 87 var csvContents = contents.map(function(l){return l.join(',')}).join('\r\n'); 88 console.log("cvsContents = ",csvContents);
何かいい方法がありましたらぜひ教えてください。
宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー