根据内容编辑csv文件名

时间:2016-12-15 09:45:57

标签: csv batch-file cmd

我的工作时间有很多csv文件。给定的文件可能如下所示:

Day,"Clocked In","Pay From","Clocked Out","Pay To",Type,Confirmed,Lunchtime,HH:MM
Monday,"12-Dec-2016 08:17","12-Dec-2016 08:17","12-Dec-2016 17:27","12-Dec-2016 17:27",,ABC,00:30,08:40
Tuesday,"13-Dec-2016 08:32","13-Dec-2016 08:32","13-Dec-2016 17:26","13-Dec-2016 17:26",,EEF,00:30,08:24
Wednesday,"14-Dec-2016 08:16","14-Dec-2016 08:16","14-Dec-2016 13:08","14-Dec-2016 13:08",,ABC,,04:52
Wednesday,"14-Dec-2016 13:08","14-Dec-2016 13:08","14-Dec-2016 17:30","14-Dec-2016 17:30",,AIF,00:30,03:52
Thursday,"15-Dec-2016 08:28","15-Dec-2016 08:28",,,,,00:00,00:00

我正在尝试创建一个程序(可能是一个与任务计划程序结合的批处理文件),每天在某个时间/每当新的csv文件导出到我的文档时运行。它根据第2列第2行重命名在那里找到的所有csv文件。该周第一次进入的日期。它将文件移动到指定位置(C:\Users\ [username]\Documents\Data),其中R2C2中具有相同值的任何文件都将被删除,只留下最近导出的文件。

一些细节:

这些文件当前的名称与[username]_export_15_Dec_2016 09_03_50.csv一样,在文件名中创建日期和时间。我希望最终得到{。1}} .csv文件的R2C2值减去时间。所以我想这个原始文件名可以用来删除任何具有相同R2C2值的旧文件,这意味着我不再有任何重复文件。

我尝试了以下代码只是为了重命名文件,但很快意识到我不知道如何实现代码(每当我将新的csv文件导出到我的文档时都运行它),也不知道怎么做自动删除。然而,我在excel中使用power查询进行分析,如果文件名包含足够的信息,我可以通过它进行重复删除。

12-Dec-2016.csv

此外,当前代码(通过“我的文档”中的.bat文件运行时)会删除所有.csv文件或至少删除它们,以便我无法在任何地方找到它们,我不知道为什么(你可以可能告诉我对这种编程完全不熟悉)

1 个答案:

答案 0 :(得分:0)

无法看到"以下代码"你提到......

@ECHO OFF
SETLOCAL
del "flagfile" >nul 2>nul
:again
SET "sourcedir=U:\sourcedir"
FOR /f "delims=" %%f IN ('dir /b /a-d "%sourcedir%\*.csv"') DO (
 SET "renamed="
 FOR /f "usebackqskip=1tokens=2delims=, " %%a IN ("%sourcedir%\%%f") DO (
  IF NOT DEFINED renamed IF "%%~nf" neq "%%~a" ECHO( MOVE /y "%sourcedir%\%%f" "%sourcedir%\%%~a.csv" 
  SET renamed=Y
 )
)
timeout /t 20 >nul
if not exist "flagfile" goto again
GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

为了测试目的,所需的MOVE命令仅为ECHO在您确认命令正确后,将ECHO(MOVE更改为MOVE以实际移动文件。附加>nul以取消报告消息(例如1 file moved

扫描.csv个文件的源目录,依次将每个名称分配给%%f

设置renamed标志并读取文件,跳过第一行并从第二个"列"中将新名称分配给%%a;其中列由,分隔。

如果尚未设置renamed标志,那么我们在第2行,因此请检查%%f(仅限名称部分)中的当前名称是否与{{1}中的当前名称相同(删除引用后)。如果名称不同,则执行%%a重命名文件,覆盖move中名称的任何现有文件。

然后设置%%~a标记,以便renamed的后续行不再尝试重命名文件

我在例程中添加了一个简单的调度程序。它依赖于一个文件,可以放在你喜欢的任何地方,无论你喜欢什么名字。

首先,删除flagfile

然后,在运行主例程之后,添加.csv,其中timeout之后的数字是整数秒。 /t会抑制>nul的提示。

超时结束后,例程会检查flagfile。如果它不存在,我们重新运行例程,捕获任何新文件。如果它存在,我们退出,所以你需要做的就是创建标记文件。