2017-08-02 13 views
0

jsonソースから、LOAD DATA INFILEの助けを借りてmemsqlデータベースを移植するために使用したいcsvを作成します。csv生成のためのヌル入力可能なフィールドを扱うには?

私は会話のためのスクリプトスクリプトを書いており、ライブラリjson2csvを使用しています。

それはのような文字列の作成、しかし空のヌルエントリの値を残し:

foo, bar, , barz, 11 , 

をしかし、私は私の出力があることを期待:私のヌルフィールドの

foo, bar, \N , barz, 11 , \N 

。それ以外の場合は、NULLの数字の場合は、0などの異なるデフォルト値がデータベースに入力されます。

私は自分自身がやって発見:

const someEntitites.map((entity: Entity) => { 
    entity.foo = entity.foo === null ? '\\N' : entity.foo; 
    entity.bar = entity.bar === null ? '\\N' : entity.bar; 
    ... 

    return entity; 
} 

をだから、基本的に、私は私のエンティティへの私のアプローチをハードコーディングしています、と私はNULL可能プロパティをチェックすることを忘れているかもしれないと私はまた、バグが発生しやすいと思います。別のテーブルをエクスポートする場合は、これをもう一度繰り返す必要があります。

これを一般化することができます。そのため、スクリプトがnull可能なフィールドを「検出」し、それに応じてマーカーを設定する別のエンティティでこれを使用できますか?

+0

あなたの 'Entity'タイプの詳細を投稿できますか? – jcalz

+0

@jcalz特定のエンティティタイプは無関係でなければなりません。私自身の答えを見てください。 – k0pernikus

+0

'Entity'のすべてのプロパティはnullの可能性がありますか? – jcalz

答えて

0

私は独自のプロパティに対して反復機能を作成し、応じて値がnullある場合\Nにその値を設定します:

const handleNullCases = (record: any): any => { 
    for (let key in record) { 
     if (record.hasOwnProperty(key)) { 
      const value = record[key]; 
      if (value === null) { 
       record[key] = "\\N"; 
      } 
     } 
    } 

    return record; 
}; 

私も他のエンティティのためにそのsnippletを再利用することができますこの方法を:

const processedEntities = entities.map(handleNullCases); 
const processedEntities2 = entities2.map(handleNullCases); 
... 

私はちょうどanyの型ヒントで、それが別の型として宣言されている可能性がありますが、値を文字列にキャストしているので、少し汚れています。

0

Entityのすべてのプロパティがnullであると仮定します。もしそうなら、このタイピングは少し安全です:

type Nullable<T> = {[K in keyof T]: T[K] | null}; 
type CSVSafe<T> = {[K in keyof T]: T[K] | '\\N'}; 

const handleNullCases = <E>(record: Nullable<E>): CSVSafe<E> => { 
    let ret = Object.assign(record) as CSVSafe<E>; 
    Object.keys(ret).forEach((key: keyof E) => { 
    if (record[key] === null) { 
     ret[key] = '\\N'; 
    } 
    }); 
    return ret; 
}; 

type Entity = Nullable<{ a: number, b: string, c: boolean, d: number, e: string }>; 
const entity: Entity = { a: 1, b: null, c: false, d: null, e: 'e' }; 
const safeEntity = handleNullCases(entity); 
// type CSVSafe<{ a: number; b: string; c: boolean; d: number; e: string; }> 

handleNullCases関数は、その値がnullかもしれない任意のオブジェクトを取り、null値に置き換えられていることを除いて全く同じである新しいオブジェクトを返します。 "\\N"。出力タイプは、Nullable<>入力タイプのCSVSafe<>バージョンになります。

希望に役立ちます。

関連する問題