首页 > 解决方案 > 在 bash 脚本中使用 csvkit 将 CSV 转换为所需的格式?

问题描述

我需要将一个大的 csv 文件转换为 Kirby CMS 的静态内容格式。

假设我有一个 csv 文件:

id,name,age,bio
0,bob,25,"Example bio, with a comma"
1,sam,37,"Hello World"
...

我想重组为单独的文件夹/文件,如下所示:

1_bob/person.txt

ID: 0
----
Name: bob
----
Age: 25
----
Bio: Example bio, with a comma

2_sam/person.txt

ID: 1
----
Name: sam
----
Age: 37
----
Bio: Hello World

ETC...

这显然是我的数据的一个更加简化的版本,因此我考虑过使用csvkit它,因为它能够正确解析引用字段等中的逗号。

我找到了这个脚本:https://forum.getkirby.com/t/import-from-csv/6038/15由于上述问题而失败(基本 bash IFS 无法读取更复杂的 CSV 数据)

#!/bin/bash
OLDIFS=$IFS
IFS=";"
while read number year title website slug
do
  if [ ! -d "$number-$slug" ]; then
    mkdir ./$number-$slug
  fi
  echo -e "Year: $year\n----\nTitle: $title\n----\nWebsite: $website" > $number-$slug/project.txt
done < projects.csv
IFS=$OLDIFS

我知道我可以编写一个 python 脚本来轻松完成此操作,但想知道是否确实有一种方法可以结合 csvkit 的任何工具在 bash 脚本中执行此操作。我的假设是用来csvcut从 csv 中提取数据行,但当然我仍然处于如何解析这些数据并将其输出为所需格式的同一块。

标签: pythonbashcsv

解决方案


通常,使用 bash、awk 和许多实用程序处理 TSV 文件与 CSV 文件相比要容易得多。它避免了引用的需要。csvformat 将处理conerion:

使用您当前的脚本:

csvformat -T projects.csv | while IFS=$'\t' read number year title website slug
do
  if [ ! -d "$number-$slug" ]; then
    mkdir ./$number-$slug
  fi
  echo -e "Year: $year\n----\nTitle: $title\n----\nWebsite: $website" > $number-$slug/project.txt
done

代码期望每条记录都有“slug”列,这不在示例输入中。我假设实际输入将在第 5 列


推荐阅读