如何根据文件名从具有多列的目录列表中创建 CSV 文件?

如何根据文件名从具有多列的目录列表中创建 CSV 文件?

我有一系列图像文件,这些文件是收据的扫描件。它们看起来像这样:

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

您可以独立添加标题。

相关内容