如何使用批处理从文件的第一行提取字符串?

时间:2015-06-18 04:54:14

标签: windows batch-file cmd batch-processing

我有这些文件在我要提取的第一行中包含一个名称。我接近的所有方法都会导致错误或者什么也不给我。

可以在此处找到示例文件:https://www.dropbox.com/s/0kcgj8vr3wii33s/FORS2.2011-10-23T23_59_20.355_out.fits?dl=0

我希望提取“PN-G013.3 + 01.1”,它位于第一行(在本例中为第2091列,每个文件的名称都是唯一的),并被归类为“OBJECT”。

提前谢谢!

彼得

2 个答案:

答案 0 :(得分:2)

有趣的问题!可以使用set /P命令通过长度为1023个字符的块读取长行;只要行长度小于8193个字符,此方法就可以正常工作。此方法还允许您搜索整个文件中的任何字符串,而不仅仅是在第一行中,并且不需要任何硬编码长度。

@echo off
setlocal EnableDelayedExpansion

set "file=FORS2.2011-10-23T23_59_20.355_out.fits"
call :ReadLongLine < "%file%"
goto :EOF


:ReadLongLine

set "line="

:nextPart
   set "part="
   set /P part=
   set "line=!line!!part!"
if "!part:~1022!" neq "" goto nextPart

set "line=!line:*OBJECT=!"
for /F "tokens=2 delims='" %%a in ("!line:~0,80!") do set "result=%%a"
echo Result: "%result%"

答案 1 :(得分:1)

我怀疑你有问题因为它有Unix行结尾而不是DOS样式行结尾。

这似乎有效,但它有点脆弱 - 与您链接的示例内容的位置有关:

for /f "usebackq delims== tokens=28" %%a in (`findstr /n "OBJECT" FORS2.2011-10-23T23_59_20.355_out.fits`) do (
set x=%%a
)
set x=%x:'=%
for /f "tokens=1" %%a in ("%x%") do (set x=%%a)
echo %x%

如果它始终是14个字符的名称字段,您可以跳过最后一个for循环并尝试:

for /f "usebackq delims== tokens=28" %%a in (`findstr /n "OBJECT" FORS2.2011-10-23T23_59_20.355_out.fits`) do (
set x=%%a
)
set x=%x:~2,14%
echo %x%