Bash XSV 自动使用 CSV 列填充空值
Bash XSV auto populate empty values with CSV column
我有一个 CSV 导出文件,我需要将其映射到新值,以便随后导入到不同的系统中。我正在使用 ArangoDB 来创建这个数据迁移映射。
下面是使用的完整脚本:
#!/bin/bash
execute () {
filepath=
prefix=
keyField=
filename=`basename "${filename%.csv}"`
collection="$prefix$filename"
filepath="/data-migration/$filepath"
# Check for "_key" column
if ! xsv headers "" | grep -q _key
# Add "_key" column using the keyfield provided
then
xsv select $keyField "" | sed -e "1s/$keyField/_key/" > "._key"
xsv cat columns "" "._key" > ".cat"
mv ".cat" ""
rm "._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
到目前为止,我已经推导出 $keyField
(OLD_ORG_ID__C
) 参数传递给 execute()
函数,在循环中使用的脚本。这将查找 $keyField
列,然后使用 XSV toolkit.
将值迁移到新创建的 _key
列
OLD_ORG_ID__C | _key
A123 -> A123
B123 -> B123
-> ## <-auto populate
不幸的是,并非每一行都有 OLD_ORG_ID__C
列的值,因此该行的 _key
也是空的,这会导致导入 Arango 失败。
注意:此 _key
字段是我的 AQL 脚本正常工作所必需的
如何重写循环以自动索引空白值?
then
xsv select $keyField "" | sed -e "1s/$keyField/_key/" > "._key"
xsv cat columns "" "._key" > ".cat"
mv ".cat" ""
rm "._key"
fi
有没有更好的方法来解决这个问题?也许 xsv sort
由 keyField
然后自动填充从空白行到末尾?
更新: 根据 comments/answer 我尝试了一些类似的方法,但到目前为止仍然没有用
#!/bin/bash
execute () {
filepath=
prefix=
keyField=
filename=`basename "${filename%.csv}"`
collection="$prefix$filename"
filepath="/data-migration/$filepath"
# Check for "_key" column
if ! xsv headers "" | 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' > -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
值。最好我只想在 OLD_ORG_ID__C
为空白时看到用自动编号值填充的“_key”值,否则他们应该复制提供的值。
如果您的问题是"how can I find from the first header line of a CSV file which field is named OLD_ORG_ID__C
, then on subsequent lines put a unique value in this column if it is empty",请尝试
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 "" |
sed -e "1s/$keyField/_key/" > "._key"
那么你可能可以用
之类的东西替换它
xsv select "$keyField" "" |
awk -v field="$keyField" 'NR==1 { [=12=] = field }
/^$/ { [=12=] = NR } 1' >"._key"
用 $keyField
的值替换第一行,并用它们的行号替换任何后续空行。
我有一个 CSV 导出文件,我需要将其映射到新值,以便随后导入到不同的系统中。我正在使用 ArangoDB 来创建这个数据迁移映射。
下面是使用的完整脚本:
#!/bin/bash
execute () {
filepath=
prefix=
keyField=
filename=`basename "${filename%.csv}"`
collection="$prefix$filename"
filepath="/data-migration/$filepath"
# Check for "_key" column
if ! xsv headers "" | grep -q _key
# Add "_key" column using the keyfield provided
then
xsv select $keyField "" | sed -e "1s/$keyField/_key/" > "._key"
xsv cat columns "" "._key" > ".cat"
mv ".cat" ""
rm "._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
到目前为止,我已经推导出 $keyField
(OLD_ORG_ID__C
) 参数传递给 execute()
函数,在循环中使用的脚本。这将查找 $keyField
列,然后使用 XSV toolkit.
_key
列
OLD_ORG_ID__C | _key
A123 -> A123
B123 -> B123
-> ## <-auto populate
不幸的是,并非每一行都有 OLD_ORG_ID__C
列的值,因此该行的 _key
也是空的,这会导致导入 Arango 失败。
注意:此 _key
字段是我的 AQL 脚本正常工作所必需的
如何重写循环以自动索引空白值?
then
xsv select $keyField "" | sed -e "1s/$keyField/_key/" > "._key"
xsv cat columns "" "._key" > ".cat"
mv ".cat" ""
rm "._key"
fi
有没有更好的方法来解决这个问题?也许 xsv sort
由 keyField
然后自动填充从空白行到末尾?
更新: 根据 comments/answer 我尝试了一些类似的方法,但到目前为止仍然没有用
#!/bin/bash
execute () {
filepath=
prefix=
keyField=
filename=`basename "${filename%.csv}"`
collection="$prefix$filename"
filepath="/data-migration/$filepath"
# Check for "_key" column
if ! xsv headers "" | 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' > -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
值。最好我只想在 OLD_ORG_ID__C
为空白时看到用自动编号值填充的“_key”值,否则他们应该复制提供的值。
如果您的问题是"how can I find from the first header line of a CSV file which field is named OLD_ORG_ID__C
, then on subsequent lines put a unique value in this column if it is empty",请尝试
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 "" |
sed -e "1s/$keyField/_key/" > "._key"
那么你可能可以用
之类的东西替换它xsv select "$keyField" "" |
awk -v field="$keyField" 'NR==1 { [=12=] = field }
/^$/ { [=12=] = NR } 1' >"._key"
用 $keyField
的值替换第一行,并用它们的行号替换任何后续空行。