使用 AWK 解析 CSV,将字段返回到带有换行符的 bash var

使用 AWK 解析 CSV,将字段返回到带有换行符的 bash var

我必须使用密码数据库 (Keepass) 的 csv 文件将其迁移到使用其 API 的新应用程序。 API 通过 post 请求进行更新,这些请求需要 JSON 数据格式。我需要做的是使用 KeePass CSV 将密码和链接到 API 的其他信息导出。我决定使用 bash 和 awk 编写一个脚本。

csv 文件的列排列如下:

"Group","Title","Username","Password","URL","Notes","TOTP","Icon","Last Modified","Created"

“注释”字段是多行的,因为某些注释中有换行符。

"That's an important note, <br/>
some extra infos <br/>
concerning a password"

以下是发布数据的 API 请求示例,数据字段为 JSON 格式:

我没有在此请求中添加所有必需的字段,但您已经可以看到它是如何工作的。一些字段名称不同,因为 KeePass 和 API 字段名称的制作方式不同

var1=name
var2=my.name
var3=password456

curl -s --request PUT -u username123:password123 -H 'Content-Type: application/json; charset=utf-8' https://tpm.mydomain.com/index.php/api/v5/passwords/1659.json --data-binary @- <<DATA
{
"name": "$var1",
"username": "$var2",
"password": "$var3"
}
DATA

我计划逐个字段解析我的 CSV 文件,然后当我完成解析行时,我执行 API 请求以将密码发布到数据库中。然后我对剩余的每一行执行此操作。

为了处理 CSV,我找到了 AWK 语言,它似乎非常方便,并且对我的情况非常有用。我使用 gsub 命令对我的文件进行了多次测试,帮助我替换换行符 (\n)。我真的不知道如何进一步。这是其中的一些(仅是第一个作品:

cat keepass.csv | awk NF=NF RS=/\n/ OFS=\n
cat keepass.csv |awk 'BEGIN {RS=","}{gsub("/\n/","",$0); print $0}'
cat keepass.csv | awk 'BEGIN {RS=""}{gsub(/\n/,"",$6); print $0}'

我还知道你可以通过在 awk 之后添加 -v 来共享 bash var。这是我能得到的最接近的代码。

awk -v RS='"\n' -v FPAT='"[^"]*"|[^,]*' '{
print "Row n°", NR, ""
for (i=1; i<=NF; i++) {
sub(/^"/, "", $i)
printf "Field %d, value=[%s]\n", i, $i
}} keepass.csv

我正在寻找的是一个命令,通过考虑多行注释来解析 csv 的任何列,并将它们以 JSON 格式输入到 bash 的全局变量中。

我认为你需要通过执行以下操作来构建它:

awk -v 'BEGIN{parsing and replacing keeping '\n' of notes}
if end of row,
return boolean to bash for processing the API requests, wait,
restart the loop}''

我是脚本编写新手,我认为只需几行即可完成,但我不确定如何继续。如果需要,我可以将语言更改为 python,并且可以在代码中添加一些工具。

答案1

多行是 CSV 单元格的一项功能,您可以使用可识别 CSV 的实用程序磨坊主

举个例子,如果你有这个 CSV 文件你可以跑

  • mlr --csv cut -f fieldA acr.csv剪切第一列
  • mlr --icsv --ojson cut -f fieldA acr.csv剪切第一列并将全部转换为JSON
[
  {
    "fieldA": "That's an important note,\nsome extra infos\nConcerning a password\nIpsum"
  },
  {
    "fieldA": "hello"
  }
]

正如你所看到的,米勒知道单元格回车符(RFC4180符合)。

下面是示例输入文件的图像。

在此输入图像描述

答案2

“注释”字段是多行的

不! CSV 不支持多行。绝对不。

如果需要在 CSV 中存储多行字符串,有两种常见方法。

  1. \n将原始字符串中的字符更改为其他字符。通常它只是一个两个字母的“\n”字符串。
  2. 将记录分隔符更改为\n不会出现在字符串中的其他字符。通常它是类似的东西\x01

第一种方法需要一些额外的转换前和转换后,但相当可靠。

第二个 - 工作非常好且简单,但并非所有支持 CSV 的应用程序都可以更改记录分隔符,并且用作记录分隔符的字符始终有可能出现在字段内。

如果由于某种原因您无法重新创建文件并使其成为正确的 CSV,我建议使用循环:

while read row
 if row has 6 fields ("Notes" is a 6th field)
   do
     append "\n" to it
     append next row to it
   repeat until the working row has 10 fields
   export the work row to output file
 end if
end while

任何语言都可以做到(甚至bash)。

相关内容