我有一个CSV导出,需要映射到新值,然后导入到不同的系统中。我正在使用ArangoDB创建这个数据迁移映射。
下面是使用的完整脚本:
#!/bin/bash
execute () {
filepath=$1
prefix=$2
keyField=$3
filename=`basename "${filename%.csv}"`
collection="$prefix$filename"
filepath="/data-migration/$filepath"
# Check for "_key" column
if ! xsv headers "$1" | grep -q _key
# Add "_key" column using the keyfield provided
then
xsv select $keyField "$1" | sed -e "1s/$keyField/_key/" > "$1._key"
xsv cat columns "$1" "$1._key" > "$1.cat"
mv "$1.cat" "$1"
rm "$1._key"
fi
# Import CSV into Arango Collection
docker exec arango arangoimp --collection "$collection" --type csv "$filepath" --server.password ''
}
# This single line runs the execute() above
execute 'myDirectory/myFile.csv' prefix_ OLD_ORG_ID__C到目前为止,我已经推导出传递给(`OLD_ORG_IDC`__)函数的$keyField execute()参数,在脚本的循环中使用。它查找$keyField列,然后使用XSV工具包将值迁移到新创建的_key列。
OLD_ORG_ID__C | _key
A123 -> A123
B123 -> B123
-> ## <-auto populate不幸的是,并非每行都有OLD_ORG_ID__C列的值,因此该行的_key也是空的,这会导致导入到Arango失败。
注意:这个_key字段是我的AQL脚本正常工作所必需的
如何重写循环以自动索引空白值?
then
xsv select $keyField "$1" | sed -e "1s/$keyField/_key/" > "$1._key"
xsv cat columns "$1" "$1._key" > "$1.cat"
mv "$1.cat" "$1"
rm "$1._key"
fi有没有更好的办法来解决这个问题?也许xsv sort由keyField,然后自动填充从空白行到末尾?
更新:根据评论/答案,我尝试了一些类似的内容,但到目前为止仍然没有工作。
#!/bin/bash
execute () {
filepath=$1
prefix=$2
keyField=$3
filename=`basename "${filename%.csv}"`
collection="$prefix$filename"
filepath="/data-migration/$filepath"
# Check for "_key" column
if ! xsv headers "$1" | grep -q _key
# Add "_key" column using the keyfield provided
then
awk -F, 'NR==1 { for(i=1; i<=NF;++i) if ($i == "'$keyField'") field=i; print; next }
$field == "" { $field = "_generated_" ++n }1' $1 > $1-test.csv
fi
}
# import a single collection if needed
execute 'agas/Account.csv' agas_ OLD_ORG_ID__C这会创建一个Account-test.csv文件,但不幸的是它没有"_key“列或对OLD_ORG_ID__C值的更改。最好我只希望看到"_key“值填充自动编号的值时,OLD_ORG_ID__C是空的,否则他们应该复制提供的值。
发布于 2018-11-27 19:04:14
如果您的问题是“如何从CSV文件的第一个标题行中找到名为OLD_ORG_ID__C的字段,那么在后面的行中,如果它是空的,则在本列中放置一个唯一的值”,请尝试如下
awk -F, 'NR==1 { for(i=1; i<=NF;++i) if ($i == "OLD_ORG_ID__C") field=i ; print; next }
$field == "" { $field = "_generated_" ++n }1' file >newfile这没有为处理复杂的问题做任何规定,比如带有内嵌逗号的引用字段。(我不知道xsv是什么,但也许它能更好地适应这种情况?)
如果我能猜到这段代码是做什么的
xsv select $keyField "$1" |
sed -e "1s/$keyField/_key/" > "$1._key"那么也许你可以用这样的东西来代替它
xsv select "$keyField" "$1" |
awk -v field="$keyField" 'NR==1 { $0 = field }
/^$/ { $0 = NR } 1' >"$1._key"若要用$keyField值替换第一行,并用其行号替换后续空行,请执行以下操作。
https://stackoverflow.com/questions/53491752
复制相似问题