我有一系列图像文件,这些文件是收据的扫描件。它们看起来像这样:
gas_20160710_3432.jpg
gas_20160810_242.jpg
water_20161004_4510.jpg
我希望能够获取文件列表并将其转换为 CSV 文件,我可以使用命令来完成'ls' > files.csv
。
但是,我已注意使文件名包含一些有关内容的信息,并且我想解析文件名,以便在 LibreOffice Calc 中编辑 CSV 文件时可以更轻松地处理数据。
每个文件名都有收据类型,然后是 YYYYMMDD 格式的日期,然后是收据上写的金额。因此,我想将这些信息分成不同的列,并有一列包含完整的文件名。因此,最终结果应如下所示:
还有一个问题。日期需要从 YYYYMMDD 转换为 YYYY-MM-DD。如果没有破折号,LibreOffice Calc 似乎会感到困惑。
有没有办法从命令行的目录内容中创建我想要的 CSV 文件?
请注意,目录中除了收据扫描件外没有其他文件,因此不必过滤任何文件类型或排除具有不同格式名称的文件。
答案1
使用 perl:
ls | perl -pe 's/(.)(.*)_(\d{4})(\d{2})(\d{2})_(\d+).jpg/\u$1$2,$3-$4-$5,$6,$&/'
在 perl 中,(...)
用于对匹配的文本进行分组,因此(.)
是单个字符的组,(.*)
是任意字符串的组,(\d{2})
是两位数字的组(\d
是一位数字,和{2}
表示前两位)等等。\u
将下一个原子转换为大写。$1
,,$2
... 是按顺序排列的各个组。$&
包含整个匹配的文本。
输出:
Gas,2016-07-10,3432,gas_20160710_3432.jpg
Gas,2016-08-10,242,gas_20160810_242.jpg
Water,2016-10-04,4510,water_20161004_4510.jpg
您可以独立添加标题。