如何在Bash脚本中用csvkit将CSV转为Kirby CMS静态内容格式?
用csvkit在Bash中实现CSV转Kirby CMS静态内容
需求说明
我需要把一个包含复杂字段(比如带引号的逗号分隔内容)的大型CSV,转换成Kirby CMS要求的静态内容结构:每个CSV条目对应一个以{id}_{name}命名的文件夹,里面包含person.txt文件,文件内容用----分隔各个字段。
示例CSV内容:
id,name,age,bio 0,bob,25,"Example bio, with a comma" 1,sam,37,"Hello World"
目标结构示例:
0_bob/person.txt ID: 0 ---- Name: bob ---- Age: 25 ---- Bio: Example bio, with a comma 1_sam/person.txt ID: 1 ---- Name: sam ---- Age: 37 ---- Bio: Hello World
遇到的问题
之前尝试用原生Bash的IFS处理CSV,但它无法正确解析带引号的字段(比如字段里的逗号会被误判为分隔符),导致脚本失败。我不想用Python,想结合csvkit(专门处理CSV的工具集)来完成这个转换。
解决方案(Bash + csvkit)
csvkit里的工具可以正确解析带特殊字符的CSV,我们可以利用它们把CSV转成制表符分隔的格式,再用Bash处理:
步骤1:安装csvkit
先确保你已经安装了csvkit:
# Debian/Ubuntu系统 sudo apt install csvkit # 或者用pip安装 pip install csvkit
步骤2:完整转换脚本
#!/bin/bash # 替换成你的CSV文件路径 CSV_SOURCE="your_data.csv" # 跳过CSV表头,把每一行转成制表符分隔的格式,然后逐行处理 csvformat -T "$CSV_SOURCE" | tail -n +2 | while IFS=$'\t' read -r id name age bio; do # 创建目标文件夹,处理可能的特殊字符(这里简单用id+name,可按需调整) TARGET_FOLDER="${id}_${name}" mkdir -p "$TARGET_FOLDER" # 生成Kirby需要的person.txt文件 cat > "${TARGET_FOLDER}/person.txt" <<EOF ID: $id ---- Name: $name ---- Age: $age ---- Bio: $bio EOF echo "处理完成:$TARGET_FOLDER" done
脚本说明
csvformat -T:把CSV转换成制表符分隔的格式,这样Bash的read命令就能用IFS=$'\t'正确读取每个字段,不会被字段内的逗号干扰。tail -n +2:跳过CSV的表头行,只处理数据行。mkdir -p:确保文件夹能被创建,即使父目录不存在(这里用不到,但更健壮)。- 用Here Document (
<<EOF) 生成person.txt的内容,严格匹配Kirby的字段分隔格式。
注意事项
- 如果你的CSV有更多字段,只需要调整
read后的变量列表,以及person.txt里的字段内容即可。 - 如果
name字段包含空格、特殊字符(比如/),建议对TARGET_FOLDER做清理,比如:
把特殊字符替换成下划线,避免创建文件夹时出错。TARGET_FOLDER="${id}_$(echo "$name" | sed 's/[^a-zA-Z0-9_]/_/g')"
内容的提问来源于stack exchange,提问作者waffl
相关产品推荐
相关产品推荐

