Board logo

标题: [文本处理] [已解决]批处理怎样根据文件名新增一列并移动到其它文件夹? [打印本页]

作者: kakushang    时间: 2011-3-11 15:45     标题: [已解决]批处理怎样根据文件名新增一列并移动到其它文件夹?

大家好:
我在工作中遇到这样的业务场景:

考勤机导出数据格式为文本文件,不同的考勤机导出的文件名不一样,例如考勤机一导出为,考勤机120110311.txt,考勤机二导出为考勤机220110311.txt

文本文件的内容为

1001 2011-03-11 15:42:00
1001 2011-03-11 17:00:00

现在希望根据考勤机导出的文件名新增加一列如下:

1001 2011-03-11 15:42:00 001
1001 2011-03-11 17:00:00 001

并且将新生成的文件复制到另外的文件夹,供人事系统读取;

不知道问题描述清楚没有,17点之前在线等

[ 本帖最后由 kakushang 于 2011-3-13 10:06 编辑 ]
作者: namejm    时间: 2011-3-11 16:35

  1、新增加的那一列数据和考勤机的号码有什么关系?
  2、在“120110311.txt”这样的文件名中,考勤机号码和哪个位置上的数字对应?总共有多少台?
  3、你是希望对单独的一个文件进行处理,还是一次要处理多个这样的文件?
作者: kakushang    时间: 2011-3-11 16:43

总算有人回应了,首先感谢关注

1、新增那一列和考勤机号只能是自己写死了,例如考勤机1 就是 001 考勤机2 是 002

2、考勤机120110311应该是,考勤机1是和号码对应,实际有20台

3、希望一次处理多个文件,然后做成定时任务,每天机器自己读,自己批处理,最后系统自己完成

要求是不是太过分了,没办法,这就是实际工作
作者: kakushang    时间: 2011-3-11 17:04

17点了,先下个班,回头再上来查看一下;
作者: Batcher    时间: 2011-3-11 20:06

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set KQ_1=120110311.txt
  4. set KQ_2=220110311.txt
  5. for /l %%a in (1,1,2) do (
  6.     sed -i "s/$/ 00%%a/" !KQ_%%a!
  7. )
复制代码

作者: kakushang    时间: 2011-3-11 22:50

真厉害啊,真的可以实现;

现实的业务就是麻烦,还有两个问题:

1、文件名是前面是考勤机号:120110311,1代表1号机,后面是时间,每天,甚至不定时导出数据来,所以可能有120110312、120110313等等文件,后面都增加同样的标志位;

2、处理完的文件移动到固定的文件夹中方便系统读取;

现实真是骨感啊

[ 本帖最后由 kakushang 于 2011-3-11 23:12 编辑 ]
作者: Batcher    时间: 2011-3-11 23:00     标题: 回复 6楼 的帖子

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.txt) do (
  4.     set KQ=%%a
  5.     set KQ=!KQ:~0,1!
  6.     sed -i "s/$/ 00!KQ!/" "%%a"
  7.     move "%%a" "C:\test\"
  8. )
复制代码

作者: kakushang    时间: 2011-3-11 23:18

好吧,我承认搞IT的是个变态,我现在全部交待了

1、生成的考勤文件实际是这样的,上海店999920110311,北京店88888820110311,

就算斑竹叫我去die我也没话好说了
作者: Batcher    时间: 2011-3-11 23:27     标题: 回复 8楼 的帖子

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*.txt) do (
  4.     set KQ=%%a
  5.     set KQ=!KQ:~0,-12!
  6.     sed -i "s/$/ !KQ!/" "%%a"
  7.     move "%%a" "C:\test\"
  8. )
复制代码

作者: kakushang    时间: 2011-3-11 23:36

我测试了一下

生成的文件最后一列是00上、00北之类的,不能弄成序号吗;

这确实是我的非分要求,做IT总是有一样追求极致的偏执,就是不能这样,我也无话可说了,非常感谢斑竹
作者: Batcher    时间: 2011-3-12 01:02     标题: 回复 10楼 的帖子

很简单。
这取决于你想弄成什么样的序号。
作者: kakushang    时间: 2011-3-12 07:28

我彻底服了斑竹了,1点还在线

1、序号最好能人为的定,例如开头为上海店999999的文件,序号为001,开头为北京店888888的文件,序号为002什么的,总共大约19个考勤机

[ 本帖最后由 kakushang 于 2011-3-12 07:44 编辑 ]
作者: Batcher    时间: 2011-3-12 10:50     标题: 回复 12楼 的帖子

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set KQ_001=上海店999999
  4. set KQ_002=北京店888888
  5. for %%a in (*.txt) do (
  6.     set KQ=%%a
  7.     set KQ=!KQ:~0,-12!
  8.     for /f "tokens=1 delims==" %%b in ('set KQ_ ^| findstr "!KQ!"') do (
  9.         set num=%%b
  10.         set num=!num:~3!
  11.     )
  12.     sed -i "s/$/ !num!/" "%%a"
  13.     move "%%a" "C:\test\"
  14. )
复制代码

作者: kakushang    时间: 2011-3-12 17:17

难道是我愚钝,那个地方没有写对,没起作用,还是请斑竹大大多多照看一下

样例文件如下:
[attach]3572[/attach]
[attach]3573[/attach]
[attach]3574[/attach]
[attach]3575[/attach]

我修改的代码如下:

[attach]3576[/attach]
作者: CrLf    时间: 2011-3-12 17:24

依然不懂,14楼样例文件前后都是54b,哪有改过哦
作者: kakushang    时间: 2011-3-12 17:42

其实这是考勤机导出的文本文件;

每个考勤机导出的文件名为:上海店99999,即店名+一串无意义数字

文本内容就简单了,

考勤卡号 日期 时间

我上传的文件是我自己做的文件的,模拟两天导出的数据;
作者: Batcher    时间: 2011-3-12 18:23     标题: 回复 14楼 的帖子

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set KQ_001=上海店99999
  4. set KQ_002=北京店888
  5. for %%a in (*.txt) do (
  6.     set KQ=%%a
  7.     set KQ=!KQ:~0,-16!
  8.     for /f "tokens=1 delims==" %%b in ('set KQ_ ^| findstr "!KQ!"') do (
  9.         set num=%%b
  10.         set num=!num:~3!
  11.     )
  12.     sed -i "s/$/ !num!/" "%%a"
  13.     move "%%a" "C:\test\"
  14. )
复制代码

作者: kakushang    时间: 2011-3-12 20:18

居然问题全部解决了;

一拜

二拜

三拜

五体投地退出




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2