从文本文件中读取第一行的 Windows 批处理命令

Posted

技术标签:

【中文标题】从文本文件中读取第一行的 Windows 批处理命令【英文标题】:Windows batch command(s) to read first line from text file 【发布时间】:2010-09-12 21:46:39 【问题描述】:

如何使用 Windows 批处理文件从文本文件中读取第一行?由于文件很大,我只想处理第一行。

【问题讨论】:

试试 GNU32 “head” 实用程序。不要以为只用 DOS Batch 就能轻松完成你所追求的。 @Nasir ,不能用内置命令完成吗? 【参考方案1】:

嗯? imo这要简单得多

  set /p texte=< file.txt  
  echo %texte%

【讨论】:

+1,这是最好的 :-) 它有以下限制 1) 最大行长度为 1021 字节,不包括 EOL。 2) 文件必须使用CarriageReturn LineFeed 的Windows 样式EOL。 3)尾随控制字符将从行中剥离 此外,在读取文件之前应该明确地未定义 texte,以防第一行为空白。 Here 是修剪字符串的一些额外技巧。 echo %texte:~3% 例如将跳过前三个字符。这在您使用 BOM 读取 UTF-8 文件时很有用。【参考方案2】:

这是一个通用批处理文件,用于从 GNU head 实用程序等文件中打印顶部的 n 行,而不仅仅是一行。

@echo off

if [%1] == [] goto usage
if [%2] == [] goto usage

call :print_head %1 %2
goto :eof

REM
REM print_head
REM Prints the first non-blank %1 lines in the file %2.
REM
:print_head
setlocal EnableDelayedExpansion
set /a counter=0

for /f ^"usebackq^ eol^=^

^ delims^=^" %%a in (%2) do (
        if "!counter!"=="%1" goto :eof
        echo %%a
        set /a counter+=1
)

goto :eof

:usage
echo Usage: head.bat COUNT FILENAME

例如:

Z:\>head 1 "test file.c"
; this is line 1

Z:\>head 3 "test file.c"
; this is line 1
    this is line 2
line 3 right here

目前不计算空行。它还受制于 8 KB 的批处理文件行长度限制。

【讨论】:

仅供参考:"GOTO :EOF" 这是一个特殊的标签,它将退出脚本而无需定义一个特殊的 ":exit" 标签。在批处理中定义子例程时它也很有用(你说什么?子例程?是的) 这似乎在我的几个 GB 文本文件上爆炸了......在一个文件上它在尝试返回 10 行时给了我一个“内存不足”错误,在另一个文件上它只是返回了一个当要求它返回 10 行时,一个空行。任何想法为什么会发生这种情况? @Dan - 行有多长? FOR /F “忽略”超过 8191 字节的行。但是我想知道如果遇到很长的行是否会出现“Out of Memory”错误。 @StephanMuller - 请参阅上面我对 Dan 的评论 如所写,此答案将忽略空行。它还将忽略以分号 ; 开头的行,这是默认的 FOR /F EOL 字符。如果要求 10 行,那么它将打印前 10 行不为空且不以 ; 开头的行。【参考方案3】:

你们……

C:\>findstr /n . c:\boot.ini | findstr ^1:

1:[boot loader]

C:\>findstr /n . c:\boot.ini | findstr ^3:

3:default=multi(0)disk(0)rdisk(0)partition(1)\WINNT

C:\>

【讨论】:

如果文件的行数超过 11 行,它将比第一行打印更多,例如:1:、11:、21: 等... 塞萨尔好!我总是尽量避免引用,因为它们惹恼了我,但在这种情况下,这是一个坏主意。要修复,请更改为findstr "^1:" 并获得双引号的温暖和保护。或者,如果你鄙视像我这样的引用并想危险地生活,请使用findstr /b 1: 如果您希望它不带引号且不带 /b 选项,则只需转义插入符号:findstr ^^1 很好的提示dbenham,cmd中的转义总是让我逃脱。顺便说一句,请不要对大文件使用这种方法,它实际上是读取整个文件,效率很低。我对这个解决方案的唯一标准是 A) 它应该是单行 B) 它应该很容易记住或从内存和类型中重新创建,而不是复制粘贴 C) 没有外部工具。 set /p 解决方案对于大文件的效率要高得多。 另外,它会将行号添加到您真正想要的文本行之前!因此,当您只需要文本时就没那么有用了。【参考方案4】:

你可以试试这个:

@echo off

for /f %%a in (sample.txt) do (
  echo %%a
  exit /b
)

编辑 或者,假设您有四列数据并且想要从第 5 行向下到底部,试试这个:

@echo off

for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
  echo %%a %%b %%c %%d
)

【讨论】:

这给了我我需要但不太正确的线索。不确定正确的程序是什么,但我将此解决方案合并到最终解决方案中。见***.com/questions/130116#130209 这个解决方案的问题是它用空格而不是换行符分隔,并且你不能有一个带空格的文件名。您可以使用 for 循环中的 delims 和 usebackq 选项解决这些问题。 为我工作,但我必须添加 "delims=" 才能打印出完整的文件夹名称和空格。【参考方案5】:

感谢 thetalkingwalnut 的回答 Windows batch command(s) to read first line from text file 我想出了以下解决方案:

@echo off
for /f "delims=" %%a in ('type sample.txt') do (
echo %%a
exit /b
)

【讨论】:

【参考方案6】:

稍微建立在其他人的答案之上。现在允许您指定要从中读取的文件以及要将结果放入的变量:

@echo off
for /f "delims=" %%x in (%2) do (
set %1=%%x
exit /b
)

这意味着您可以像这样使用上面的内容(假设您将其命名为 getline.bat)

c:\> dir > test-file
c:\> getline variable test-file
c:\> set variable  
variable= Volume in drive C has no label.

【讨论】:

【参考方案7】:

一个衬里,用于使用 ">" 进行标准输出重定向:

@for /f %%i in ('type yourfile.txt') do @echo %%i & exit

【讨论】:

【参考方案8】:

powershell Get-Content file.txt -Head 1

这个比上面读取完整文件的其他 powershell 示例快得多。

【讨论】:

【参考方案9】:

试试这个

@echo off
setlocal enableextensions enabledelayedexpansion
set firstLine=1
for /f "delims=" %%i in (yourfilename.txt) do (
    if !firstLine!==1 echo %%i
    set firstLine=0
)
endlocal

【讨论】:

【参考方案10】:

循环文件(file1.txtfile1[1].txtfile1[2].txt 等):

START/WAIT C:\LAERCIO\DELPHI\CICLADOR\dprCiclador.exe C:\LAERCIUM\Ciclavel.txt

rem set/p ciclo=< C:\LAERCIUM\Ciclavel.txt:
set/p ciclo=< C:\LAERCIUM\Ciclavel.txt

rem echo %ciclo%:
echo %ciclo%

它正在运行。

【讨论】:

对此的解释是:set /p通过提示询问;但是,通过文件重定向&lt;,它会立即在提示符处获取文件的内容;并且由于第一行以换行结束,此时提示停止读取,因此仅将第一行存储在变量中。【参考方案11】:

EXIT /B 解决方案的问题,更现实地是在批处理文件中作为它的一部分,如下所示。在EXIT /B之后,所述批处理文件内没有后续处理。通常,批次不仅仅是一项有限的任务。

为了解决这个问题:

@echo off & setlocal enableextensions enabledelayedexpansion
set myfile_=C:\_D\TEST\My test file.txt
set FirstLine=
for /f "delims=" %%i in ('type "%myfile_%"') do (
  if not defined FirstLine set FirstLine=%%i)
echo FirstLine=%FirstLine%
endlocal & goto :EOF

(不过,所谓的毒字还是会有问题的。)

关于使用批处理命令获取特定行的更多信息:

如何获取文本文件的第 n 行、第一行和最后一行?" http://www.netikka.net/tsneti/info/tscmd023.htm

[2012 年 8 月 28 日添加] 还可以:

@echo off & setlocal enableextensions
set myfile_=C:\_D\TEST\My test file.txt
for /f "tokens=* delims=" %%a in (
  'type "%myfile_%"') do (
    set FirstLine=%%a& goto _ExitForLoop)
:_ExitForLoop
echo FirstLine=%FirstLine%
endlocal & goto :EOF

【讨论】:

set /p texte= 【参考方案12】:

这是使用powershell 的解决方法:

powershell (Get-Content file.txt)[0]

(您还可以使用powershell (Get-Content file.txt)[0..3] 轻松阅读一系列行)

如果您需要在批处理脚本中设置一个变量作为file.txt 的第一行,您可以使用:

for /f "usebackq delims=" %%a in (`powershell ^(Get-Content file.txt^)[0]`) do (set "head=%%a")

【讨论】:

Powershell 很慢【参考方案13】:

请注意,批处理文件方法将仅限于 DOS 命令处理器的行数限制 - 请参阅What is the command line length limit?。

因此,如果尝试处理包含多于 8192 个字符的行的文件,则脚本将跳过它们,因为无法保留该值。

【讨论】:

【参考方案14】:

另一种方式

setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))

【讨论】:

我建议仅在不得已的情况下使用 .bat 文件。如果可能,请始终尝试使用“真正的”脚本语言:Powershell、WSH、Python ... 除了 .bat 文件之外的任何东西。 批处理并不是那么坏(当你知道,你做什么;与所有其他语言一样)。 hhay:你的代码不工作。 因为你不用delayed expansion @paulsm4:批处理文件有什么问题?它适用于所有类型的 Windows,并且具有称为延迟扩展的独特功能,只要您了解它,就可以在不安装 3rd 方软件的情况下发生魔法。早在 Powershell 和 dotNet 之前,您知道您可以使用 DOS 和批处理文件进行 TCP/IP 吗?【参考方案15】:

在 Windows PowerShell 中,下面的 cmd 可用于获取第一行并将其替换为静态值

powershell -Command "(gc txt1.txt) -replace (gc txt1.txt)[0], 'This is the first line' | Out-File -encoding ASCII txt1.txt"

参考


How can you find and replace text in a file using the Windows command-line environment?

【讨论】:

【参考方案16】:

仅打印第一行(无需读取整个文件):

set /p a=< file.txt & echo !a!

要打印第一行,然后等待用户按下下一行的键: (打印需要的行后,按Ctrl+C停止。)

for /f "delims=" %a in (downing.txt) do echo %a & pause>nul

要打印第一 n 行(无需用户按键):

type nul > tmp & fc tmp "%file%" /lb %n% /t | find /v "*****" | more +2

在 Win 10 CMD 上测试。

【讨论】:

以上是关于从文本文件中读取第一行的 Windows 批处理命令的主要内容,如果未能解决你的问题,请参考以下文章

从文本文件中读取第一行而不将整个文本文件加载到内存中

使用streamreader读取csv时如何跳过第一行

关于C语言中文本文件的逐行读取的实现

python 从NiFi ExecuteScript处理器使用的Python脚本示例,它从传入的流文件中读取第一行。

Python编程:从入门到实践——作业——第十章(文件和异常)

javascript一行一行的读取文本