Board logo

标题: [求助] 如何取得一个文件的指定行数的指定位置内容 [打印本页]

作者: krell     时间: 2006-10-3 13:58    标题: [求助] 如何取得一个文件的指定行数的指定位置内容

批处理如何取得一个文件的指定行数的指定位置内容,并写到另一个文件中。

比如一个文件的第5排的倒数12位字符,和第6排的倒数1-3位字符(该行内容中有一个=符号后可能是1-3位字符)。

得到这两个数值后,写入到另一个文件的指定行数中。(简单点输出到文件也可以,行数不多)

实在是不会任何编程,想想批处理应该最简单吧。可是,看了不少教程,没发现讲解如何得到一个文件中的指定内容的实现方法,请各位大大指点一下,谢谢!
作者: namejm     时间: 2006-10-3 21:24
  初步写出了如下代码,楼主试一下看是否可行。另外,如果能把文件的内容贴一部分出来的话,就更好找一下规律,因为我不知道你所说的 “和第6排的倒数1-3位字符(该行内容中有一个=符号后可能是1-3位字符)。” ,要提取的内容究竟是倒数1~3的字符,还是倒数的1或2或3。
@echo off
set num=0
setlocal enabledelayedexpansion
for /f "skip=4 delims=" %%i in (test.txt) do (
    set /a num+=1
    set var=%%i
    if !num! equ 1 echo !var:~-12,1!
    if !num! equ 2 echo !var:~-3,3! && goto end
)
:end
pause
[ Last edited by namejm on 2006-10-3 at 21:51 ]
作者: pengfei     时间: 2006-10-3 21:28
namejm兄的代码简洁, 如果把文本行中存在空格就无法整行提取的情况考虑进去就更好了.
作者: namejm     时间: 2006-10-3 21:33


  Quote:
Originally posted by pengfei at 2006-10-3 21:28:
namejm兄的代码简洁, 如果把文本行中存在空格就无法整行提取的情况考虑进去就更好了.

  呵呵,其实已经能够提取行中可能存在的空格的。

  for语句中,提取存在空格的行,除了用 "tokens=*" 之外,"delims=" 也是一个不错的选择,头两天在群里讨论过的,pengfei 可能没注意到。
作者: pengfei     时间: 2006-10-3 21:42
呵呵~  的确如此, 看来整行提取有三种方法了:

tokens=*   delims=*  delims=

不过我还是发现兄弟的代码for中少了一个/F参数. ^_^
作者: namejm     时间: 2006-10-3 21:50
  谢谢你的提醒,确实是少了一个 /F 参数,以前写代码的时候都测试过了才发出来的,这次这个因为觉得简单就没测试了,想不到竟然出现了这个低级错误,已经改正^_^

  到目前为止,提取整行的方法我只发现了两种,而你所说的 delims=* 是难以提取的,因为它的含义只是提取以 * 分隔的内容而已。当内容中不含 * 的时候,它也会提取含有空格的行,但是,如果内容中有 * 的时候,情况就大不一样了,你测试一下就可以发现了。
作者: pengfei     时间: 2006-10-4 05:06


  Quote:
Originally posted by namejm at 2006-10-3 21:50:
  到目前为止,提取整行的方法我只发现了两种,而你所说的 delims=* 是难以提取的,因为它的含义只是提取以 * 分隔的内容而已。当内容中不含 * 的时候,它也会提取含有空格的行,但是,如果内容中有 * 的时候,情况就大不一样了,你测试一下就可以发现了。

看来这是我的一个习惯性错误了.

"tokens=*" 将文本行内容都赋给第一个可替换变量

"delims=" 不使用任何分隔符, 作用是取消了默认空格作为分隔符. 使文本行中的内容都赋给一个可替换变量.

"delims=*" 而这个是使用特殊分隔符, 来替代空格. 显然不行的, 像兄说的这样, 呵呵~  一旦出现该字符将不能正常提取.
作者: krell     时间: 2006-10-4 12:59
谢谢两位热心的大侠。不过试了一下,好像不行。

需要得到数值的文件内容如下:
[Program ]
Name = NEW ERY
Source=FAC
[FAC]
ImageFileName=90B5A901.ACR
ImageFileNumber=34
[Burn]
ImageFileNumber=0
Description=
[Action]
DoRecovery=No


需要的数值是 90B5A901.ACR 和 34 (这个34有可能是1位的数据,也有可能是两位的数据,也有可能是3位的数据)。

得到这两个数据后写到一个新文件中。
Image_Name=这里写90B5A901.ACR,Image_Count=这里写34。

新文件内容如下:
[Program ]
Name = NEW ERY
Source=FD_INFO
[FD_INFO]
Image_Name=
Image_Count=
Image_Size=51200
Image_PerDisc=13
Image_Language=1033

想象中这个操作应该很简单的吧,不是想不劳而获,而是实在太菜,希望大侠再给点意见,谢谢!
作者: pengfei     时间: 2006-10-5 00:23
请楼主测试效果:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims==" %%i in (1.ini) do (
    set /a num+=1
    if !num! lss 8 (
        if /i "%%i"=="ImageFileName" set one=%%j
        if /i "%%i"=="ImageFileNumber" set two=%%j
    )
)
(
echo [Program ]
echo Name = NEW ERY
echo Source=FD_INFO
echo [FD_INFO]
echo Image_Name=%one%
echo Image_Count=%two%
echo Image_Size=51200
echo Image_PerDisc=13
echo Image_Language=1033
)>2.ini
pause

作者: namejm     时间: 2006-10-5 00:36
  set /a num+=1 一句可以省略,在for中用 skip=4 直接跳过头4行的内容就可以从第五行内容开始读取了。或者用 more +4 1.ini 也可以达到同样的效果。
作者: pengfei     时间: 2006-10-5 01:45
我使用计数的方式提取数据是因为ImageFileNumber这一句出现了两次.
作者: krell     时间: 2006-10-5 04:12
呵呵,还是不行呀。

生成的新文件并未得到取值,还是这样的啦!大侠可以试试。
Image_Name=
Image_Count=
作者: pengfei     时间: 2006-10-5 05:02
需要得到数值的文件默认为当前目录下的1.ini
作者: krell     时间: 2006-10-5 05:45
就算是再菜也知道文件名和路径的。

不过,测试一下真的没有得到想要的结果。

附件当中的文件,楼上的大侠自己试一下了!
附件 1: 1.rar (2006-10-5 05:45, 598 bytes, 下载附件所需积分 1点 ,下载次数: 21)

作者: pengfei     时间: 2006-10-5 08:08
哈哈~ 看来又发现一个新大陆, 楼主的1.ini文件为unicode编码.

这种编码格式的文本行for是无法提取的, 我把1.ini改为ANSI码. 请测试...
附件 1: test.rar (2006-10-5 08:08, 546 bytes, 下载附件所需积分 1点 ,下载次数: 24)

作者: krell     时间: 2006-10-5 13:00
确实可行,但 Unicode 怎么办?

能否 Type 1.ini 后再查找需要的数值,并生成新的 2.ini 呢?
作者: namejm     时间: 2006-10-5 20:09
  能与不能,自己多试验几次就知道了。其实,除了用 type 之外,more 也是可以的。
作者: pengfei     时间: 2006-10-5 22:53
呵呵~ 回显后接管道命令, 这正是我的想法. 代码更新如下, 请测试...
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims==" %%i in ('more 1.ini ^| findstr /i /c:"ImageFileName" /c:"ImageFileNumber"') do (
    set /a num+=1
    if !num! lss 3 (
        if /i "%%i"=="ImageFileName" set one=%%j
        if /i "%%i"=="ImageFileNumber" set two=%%j
    )
)
(
echo [Program ]
echo Name = NEW ERY
echo Source=FD_INFO
echo [FD_INFO]
echo Image_Name=%one%
echo Image_Count=%two%
echo Image_Size=51200
echo Image_PerDisc=13
echo Image_Language=1033
)>2.ini
pause

作者: krell     时间: 2006-10-6 03:50
多谢 Pengfei 不厌其烦的指导,代码有效。

暂时急用,以后一定好好学习。
作者: xiaoluo729     时间: 2008-10-10 17:06
太好了,正好找到大大的帖子,急用着~非常感谢~
作者: selboo     时间: 2009-6-3 11:53
要回复才能下载吗