我从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;
}
所以基本上我正在硬编码我的实体方法,而且我也容易出错,因为我可能忘记检查一个可以为空的属性。如果我要导出另一张桌子,我必须重复一遍。
我如何概括这一点,所以我可以在脚本“发现”可空字段并相应地设置标记的不同实体上使用它?
答案 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<>
版本。
希望有所帮助。