我的工作时间有很多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文件或至少删除它们,以便我无法在任何地方找到它们,我不知道为什么(你可以可能告诉我对这种编程完全不熟悉)
答案 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。如果它不存在,我们重新运行例程,捕获任何新文件。如果它存在,我们退出,所以你需要做的就是创建标记文件。