2017-08-02 55 views
0

我從json源創建了一個csv,我想用它在LOAD DATA INFILE的幫助下填充memsql數據庫。如何處理csv代的可空字段?

我已經爲對話寫了一個打字腳本,並使用庫json2csv

它留下了歸零項空雖然值,創建一個字符串,如:

foo, bar, , barz, 11 , 

然而,我希望我的輸出是:

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

我清零領域。否則,我的數據庫將填寫不同的默認值,例如0,其數字應爲NULL

我發現自己做:

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

    return entity; 
} 

所以基本上我硬編碼我的方法對我的實體,我也很容易出現錯誤,因爲我可能會忘記檢查爲空的屬性。如果我要出口另一張桌子,我必須重複一遍。

我如何概括這個,所以我可以在腳本「發現」可空字段並相應設置標記的不同實體上使用它?

+0

你能發表你的'實體'類型的細節嗎? – jcalz

+0

@jcalz具體的實體類型應該是不相關的。看到我自己的答案。 – k0pernikus

+0

「實體」中的所有屬性都可能爲空? – jcalz

回答

0

我創建了一個函數,迭代其自身屬性,並將其值設置爲\N如果按照價值null

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<>版本。

希望有所幫助。