Mac终端合并CSV导入Tableau出现字段拼接异常,求解决方法
解决CSV合并时行拼接导致的字段异常问题
你遇到的问题根源是部分CSV文件的最后一行末尾缺少换行符,导致前一个文件的最后一行内容和下一个文件的首行(经tail +2跳过表头后的第一行)直接拼接成了一行,从而把前一行的member/casual和下一行的ride_id合并成了memberride_id/casualride_id这类异常值。以下是几种合并阶段的修复方案:
方案1:修改现有合并命令,强制添加换行
在每个tail命令后追加&& echo,确保每个文件的内容末尾都有换行,避免和下一个文件的内容拼接:
cat 202110-divvy-tripdata_v02.csv \ <(tail +2 202111-divvy-tripdata_v02.csv && echo) \ <(tail +2 202112-divvy-tripdata_v02.csv && echo) \ <(tail +2 202201-divvy-tripdata_v02.csv && echo) \ <(tail +2 202202-divvy-tripdata_v02.csv && echo) \ <(tail +2 202203-divvy-tripdata_v02.csv && echo) \ <(tail +2 202204-divvy-tripdata_v02.csv && echo) \ <(tail +2 202205-divvy-tripdata_v02.csv && echo) \ <(tail +2 202206-divvy-tripdata_v02.csv && echo) \ <(tail +2 202207-divvy-tripdata_v02.csv && echo) \ <(tail +2 202208-divvy-tripdata_v02.csv && echo) \ <(tail +2 202209-divvy-publictripdata_v02.csv) \ > merged2.csv
注意:最后一个tail命令不需要加&& echo,避免合并文件末尾多出空行。
方案2:用awk一键完成合并(更简洁可靠)
awk会自动按行读取文件,无需担心换行问题,同时可以自动跳过后续文件的表头:
awk 'FNR==1 && NR!=1 {next} {print}' 202110-divvy-tripdata_v02.csv 202111-divvy-tripdata_v02.csv 202112-divvy-tripdata_v02.csv 202201-divvy-tripdata_v02.csv 202202-divvy-tripdata_v02.csv 202203-divvy-tripdata_v02.csv 202204-divvy-tripdata_v02.csv 202205-divvy-tripdata_v02.csv 202206-divvy-tripdata_v02.csv 202207-divvy-tripdata_v02.csv 202208-divvy-tripdata_v02.csv 202209-divvy-publictripdata_v02.csv > merged2.csv
如果所有CSV文件都在当前目录且命名有规律(比如都包含divvy-tripdata),可以简化为:
awk 'FNR==1 && NR!=1 {next} {print}' *divvy-tripdata*.csv > merged2.csv
命令逻辑:
FNR==1 && NR!=1:当读取到非第一个文件的第一行(即后续文件的表头)时,跳过该行{print}:打印所有其他行
方案3:先修复所有源文件的末尾换行
如果以后还要频繁处理这些文件,可以先批量给所有CSV文件添加末尾换行,再用原命令合并:
# 批量检查并添加末尾换行 for file in 202110-divvy-tripdata_v02.csv 202111-divvy-tripdata_v02.csv 202112-divvy-tripdata_v02.csv 202201-divvy-tripdata_v02.csv 202202-divvy-tripdata_v02.csv 202203-divvy-tripdata_v02.csv 202204-divvy-tripdata_v02.csv 202205-divvy-tripdata_v02.csv 202206-divvy-tripdata_v02.csv 202207-divvy-tripdata_v02.csv 202208-divvy-tripdata_v02.csv 202209-divvy-publictripdata_v02.csv; do tail -c1 "$file" | read -r _ || echo >> "$file" done # 再用原命令合并 cat 202110-divvy-tripdata_v02.csv <( tail +2 202111-divvy-tripdata_v02.csv) <(tail +2 202112-divvy-tripdata_v02.csv) <(tail +2 202201-divvy-tripdata_v02.csv) <(tail +2 202202-divvy-tripdata_v02.csv) <(tail +2 202203-divvy-tripdata_v02.csv) <(tail +2 202204-divvy-tripdata_v02.csv) <(tail +2 202205-divvy-tripdata_v02.csv) <(tail +2 202206-divvy-tripdata_v02.csv) <(tail +2 202207-divvy-tripdata_v02.csv) <(tail +2 202208-divvy-tripdata_v02.csv) <(tail +2 202209-divvy-publictripdata_v02.csv) > merged2.csv
脚本逻辑:检查每个文件的最后一个字符,如果不是换行符,就追加一个换行。
内容的提问来源于stack exchange,提问作者Kelsey
相关产品推荐
相关产品推荐

