You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:29:51