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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

1330閲覧

JSON2CSV使用時のtimestamp型から文字型もしくは日付型への変換

motsu3DJ

総合スコア13

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2019/03/17 05:40

firestoreに登録されたデータをCSV出力する処理を、cloud functionsで作成しています。

json2csvを利用してほぼうまく出力できているのですが一点だけ問題があります。

データの登録日付をfirestoreのtimestamp型で保存しているのですが出力した際に、

csv

1{"_seconds":1552796058,"_nanoseconds":32000000}

という用に出力されてしまいます。

js

1import * as functions from 'firebase-functions' 2import * as admin from 'firebase-admin'; 3admin.initializeApp(); 4import * as iconv from 'iconv-lite'; 5import * as json2csv from 'json2csv'; 6 7 8exports.list = functions 9 .https 10 .onRequest((request, response) => { 11 const j2c = json2csv.parse; 12 const db = admin.firestore(); 13 const ordersRef = db.collection('user'); 14 return ordersRef.get() 15 .then((querySnapshot) => { 16 const orders: DocumentData[] = []; 17 querySnapshot.forEach(doc => { 18 const order = doc.data(); 19 orders.push(order); 20 }); 21 const fields = { // 出力項目定義 22 fields: [ 23 { label: '会員番号', value: 'shopCustomerNo',stringify: true }, 24 { label: '登録日時', value: 'insDt'},   // 日付変換できない 25 { label: '姓', value: 'username1',stringify: true }, 26 { label: '名', value: 'username2',stringify: true }, 27 }; 28 29 ; // ヘッダー項目名定義 30 const csv = j2c(orders, fields); 31 const csvShiftJis = iconv.encode(csv, "Shift_JIS") 32 response.setHeader( 33 "Content-disposition", 34 "attachment; filename=user.csv" 35 ); 36 response.set("Content-Type", "text/csv; charset=Shift_JIS"); 37 response.status(200).send(csvShiftJis); 38 return "" 39 }).catch((err) => { 40 response.status(200).send("エラー発生: " + err); 41 return Promise.resolve(); 42 }); 43 });

上記のinsDTをfield指定する際に、toDate()できればいいのかと思うのですが、
公式のサンプルを見てもうまくいきません。

https://github.com/zemirco/json2csv

js

1{ 2 fields: [ 3 // Supports label -> simple path 4 { 5 label: 'some label', // (optional, column will be labeled 'path.to.something' if not defined) 6 value: 'path.to.something', // data.path.to.something 7 default: 'NULL' // default if value is not found (optional, overrides `defaultValue` for column) 8 }, 9 10 // Supports label -> derived value 11 { 12 label: 'some label', // Supports duplicate labels (required, else your column will be labeled [function]) 13 value: (row, field) => row.path1 + row.path2, // field = { label, default } 14 default: 'NULL', // default if value function returns null or undefined 15 stringify: true // If value is function use this flag to signal if resulting string will be quoted (stringified) or not (optional, default: true) 16 }, 17 18 // Support pathname -> pathvalue 19 'simplepath', // equivalent to {value:'simplepath'} 20 'path.to.value' // also equivalent to {value:'path.to.value'} 21 ] 22}

何かいい方法をご存知の方はいませんでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

これがきれいな正解かどうかはわかりませんが、、、。

JSON2CSVにわたす前の配列で変更するようにしました。

一旦、JSON.Stringifyで、文字列にしたあと、
再度、JSON.parseを行う際に、parseの第二引数に関数を指定し、
key === 'insDt'の場合に、_seconds部分をmomentに渡して、フォーマットをかけて出力しています。

9時間進めているのは、JSTにするためです。

javascript

1 2import * as moment from 'moment'; 3 4----省略---------- 5 6 7 const a = JSON.stringify(orders); 8 const b = JSON.parse(a, function (key, value) { 9 if (key === 'insDt') { 10 // return new Date(value['_seconds']*1000); 11 return moment(value['_seconds']*1000).add(9,'hours').format('YYYY/MM/DD HH:mm:ss'); 12 } else { 13 return value; 14 } 15 }); 16 17 ; // ヘッダー項目名定義 18 // const csv = j2c(orders, fields); 19 const csv = j2c(b, fields);

投稿2019/03/18 07:20

motsu3DJ

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問