如何处理csv生成的可空字段?

时间:2017-08-02 18:17:36

标签: csv typescript export-to-csv

我从json源创建了一个csv,我希望在LOAD DATA INFILE的帮助下用来填充memsql数据库。

我为对话编写了一个打字稿脚本并使用了库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;
}

所以基本上我正在硬编码我的实体方法,而且我也容易出错,因为我可能忘记检查一个可以为空的属性。如果我要导出另一张桌子,我必须重复一遍。

我如何概括这一点,所以我可以在脚本“发现”可空字段并相应地设置标记的不同实体上使用它?

2 个答案:

答案 0 :(得分: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输入提示并将值转换为字符串,即使它可能已被声明为另一种类型。

答案 1 :(得分: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的任何对象,并返回 new 对象,除了null值之外,该对象是相同的已替换为"\\N"。输出类型将是CSVSafe<>输入类型的Nullable<>版本。

希望有所帮助。