【问题标题】:How to handle nullable fields for csv generation?如何处理 csv 生成的可空字段?
【发布时间】:2018-01-10 02:46:51
【问题描述】:

我从 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;
}

所以基本上我对我的实体的方法进行了硬编码,而且我也容易出现错误,因为我可能忘记检查可空属性。如果我要导出另一个表,我必须从头再来一遍。

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

【问题讨论】:

  • 您可以发布您的Entity 类型的详细信息吗?
  • @jcalz 具体的实体类型应该是不相关的。请参阅我自己的答案。
  • Entity中的所有属性都可能为空吗?

标签: csv typescript export-to-csv


【解决方案1】:

我创建了一个函数,它遍历自己的属性并将其值设置为\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;
};

这样我也可以将该片段重用于其他实体:

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

我觉得它有点脏,因为我只是为any 输入提示并将值转换为字符串,即使它可能已被声明为另一种类型。

【讨论】:

    【解决方案2】:

    我将假设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" .输出类型将是Nullable&lt;&gt; 输入类型的CSVSafe&lt;&gt; 版本。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-30
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多