上一篇
在 Linux 中,可用
cat、
less 或
more 命令读取 CSV
核心原理与前置准备
CSV(Comma-Separated Values)文件本质是以逗号分隔的纯文本文件,每行代表一条记录,各字段按顺序排列,Linux将其视为普通文本文件处理,但需注意以下特性:
- 特殊字符:若字段包含逗号、引号或换行符,需通过转义规则处理(如双引号包裹字段)
- 编码格式:常见编码为UTF-8,但也可能存在ANSI或其他编码
- 首行用途:通常为列名(Header),部分工具可自动识别
准备工作:
- 确认文件路径与权限:
ls -l /path/to/file.csv - 查看文件头部验证结构:
head -n 5 file.csv - 检测文件编码:
file --mime-encoding file.csv
基础命令行工具
cat 命令家族
| 功能 | 命令示例 | 说明 |
|---|---|---|
| 全量显示 | cat file.csv |
直接输出全部内容,适合小文件 |
| 分页浏览 | less file.csv |
支持上下滚动、搜索(/keyword)、退出(q) |
| 截取前N行 | head -n 10 file.csv |
仅显示前10行,用于快速预览 |
| 截取后N行 | tail -n 10 file.csv |
显示末尾10行,适用于查看最新数据 |
| 合并多行显示 | cat file.csv | tr 'n' ' ' |
将所有行合并为单行(慎用,可能破坏数据结构) |
示例:
# 查看前3行并高亮显示匹配"error"的行 grep -i "error" head -n 3 data.csv --color=auto
字段级操作工具
| 工具 | 典型用法 | 功能描述 |
|---|---|---|
awk |
awk -F',' '{print $1,$3}' file.csv |
以逗号为分隔符,打印第1、3列 |
cut |
cut -d, -f2,4 file.csv |
提取第2、4列(需确保无空格干扰) |
sed |
sed 's/old_value/new_value/g' file.csv |
全局替换指定字符串(注意正则表达式语法) |
paste |
paste -s, .csv |
合并多个CSV文件的对应列(需相同列数) |
进阶技巧:
# 统计某列数值总和(假设第3列为数字)
awk -F',' '{sum += $3} END {print sum}' sales.csv
数据统计与校验
| 命令 | 示例 | 作用 |
|---|---|---|
wc |
wc -l file.csv |
统计总行数 |
wc -c |
wc -c file.csv |
统计字符总数 |
md5sum |
md5sum file.csv > checksum.md5 |
生成校验码,用于验证文件完整性 |
diff |
diff old.csv new.csv |
对比两个CSV文件差异 |
专业数据处理工具
csvtool(轻量级专用工具)
安装依赖:sudo apt install csvtool(Debian/Ubuntu)
常用参数:
-D:指定分隔符(默认逗号)-S:跳过首行(标题行)-u:统一输出格式
示例:
# 提取第2列并排序 csvtool -D, -S 1 -c 2 -t input.csv | sort > output.txt
miller(高性能CSV处理器)
安装:sudo apt install miller
特色功能:
- 自动推断分隔符
- 支持JSON/YAML/XML转换
- 内置SQL-like查询语言
示例:
# 按第3列分组求平均值 mlr --icsv --opprint stats -f 3 input.csv
Python脚本(灵活扩展)
import pandas as pd
df = pd.read_csv('data.csv', encoding='utf-8')
print(df.head()) # 显示前5行
print(df['column_name'].value_counts()) # 统计某列值分布
优势:可结合NumPy/Matplotlib进行可视化分析,或调用API接口推送至数据库。
常见问题解决方案
场景1:处理带引号的复杂字段
若某字段包含逗号或换行符,会被双引号包裹,此时直接使用cut可能失效,建议改用:
# 使用awk正确解析带引号的字段
awk -F'"' '{print $2}' problematic.csv # 提取第二个被引号包裹的字段
场景2:大规模文件性能优化
对于GB级大文件:
- 使用
split分割文件:split -l 10000 large.csv small_part_ - 并行处理:
parallel --pipepart <(cat chunk) process_script.sh - 内存映射:
pv < large.csv | mbuffer -m 1G | ...(需配合其他工具)
安全与最佳实践
- 权限控制:避免直接执行来自不可信来源的CSV文件(
#!/bin/bash注入风险) - 备份机制:修改前创建副本:
cp original.csv original.bak - 编码转换:若遇乱码,尝试指定编码:
iconv -f GBK -t UTF-8 input.csv > output.csv - 日志记录:重要操作添加审计日志:
script -c "command" logfile.log
相关问答FAQs
Q1: 如何跳过CSV文件的标题行进行处理?
A: 多数工具支持跳过首行参数:
awk:awk -F',' 'NR>1 {print $0}' file.csvcsvtool:csvtool -S 1 ...pandas:pd.read_csv('file.csv', skiprows=1)
Q2: 遇到”Invalid number of fields”错误怎么办?
A: 此错误通常由以下原因导致:
- 不一致的列数:检查是否存在空行或异常行(用
grep -vE '^[^,]+$' file.csv定位) - 未转义的特殊字符:启用严格模式排查:
csvlint --strict file.csv - 编码问题:尝试强制指定编码:`iconv -f ISO-8859-1 -t UTF-8 file.csv
