पाठ फ़ाइल से पहली पंक्ति को पढ़ने के लिए विंडोज बैच कमांड


84

मैं Windows बैच फ़ाइल का उपयोग करके पाठ फ़ाइल से पहली पंक्ति कैसे पढ़ सकता हूं? चूंकि फ़ाइल बड़ी है, मैं केवल पहली पंक्ति से निपटना चाहता हूं।


1
GNU32 "सिर" उपयोगिता का प्रयास करें। यह मत सोचो कि आप जो हैं उसके बाद बस डॉस बैच द्वारा आसानी से पूरा किया जाएगा।
नासिर

@ नासिर, क्या यह इनबिल्ट कमांड के साथ नहीं किया जा सकता है?
प्रज्वल धतवालिया

जवाबों:


48

यहाँ एक सामान्य-प्रयोजन बैच फ़ाइल है , जो कि केवल एक लाइन के बजाय nGNU headउपयोगिता जैसी फ़ाइल से शीर्ष रेखाएँ मुद्रित करती है ।

@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 के बैच-फ़ाइल लाइन-लेंथ प्रतिबंध के अधीन भी है।


10
FYI करें: "GOTO: EOF" यह एक विशेष लेबल है जो एक विशेष ": निकास" लेबल को परिभाषित किए बिना स्क्रिप्ट से बाहर निकल जाएगा। बैच में सबरूटीन्स को परिभाषित करते समय यह भी उपयोगी है (आप क्या कहते हैं? सबरूटीन्स? येप)
स्टीवन

4
ऐसा लगता है कि मेरी कई जीबी टेक्स्ट फाइलों पर बमबारी हुई है ... एक फाइल पर उसने मुझे "आउट ऑफ मेमोरी" त्रुटि दी थी, जब 10 लाइनों को वापस करने की कोशिश की जा रही थी, दूसरी फाइल पर इसे वापस करने के लिए कहने पर यह केवल एक खाली लाइन लौटाती है 10 लाइनें। किसी भी विचार क्यों ऐसा होता है?
डैन

1
@ दान - रेखाएँ कितनी लंबी होती हैं? 8191 बाइट्स की तुलना में / F "लाइनों की उपेक्षा" के लिए। लेकिन मुझे आश्चर्य है कि अगर "आउट ऑफ मेमोरी" त्रुटि उत्पन्न होती है अगर यह वास्तव में लंबी लाइन का सामना करती है।
डेन्थम

@StephanMuller - ऊपर दी दान पर मेरी टिप्पणी देखें
dbenham

जैसा कि लिखा गया है, यह उत्तर खाली रेखाओं की उपेक्षा करेगा। यह उन लाइनों को भी अनदेखा करेगा जो एक अर्धविराम से शुरू होती हैं ;, डिफ़ॉल्ट फॉर / एफ ईओएल चरित्र। यदि 10 लाइनों के लिए पूछ रहे हैं, तो यह पहले 10 लाइनों को प्रिंट करेगा जो खाली नहीं हैं और इसके साथ शुरू नहीं होते हैं ;
डेन्हम

224

उह? imo यह बहुत सरल है

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

16
+1, यह सबसे अच्छा है जब यह काम करता है :-) इसकी सीमाएं 1 हैं) 1021 बाइट्स की अधिकतम लाइन की लंबाई, ईओएल सहित नहीं। 2) फ़ाइल में कैरिज रीटर्न लाइनफीड के विंडोज स्टाइल ईओएल का उपयोग किया जाना चाहिए। 3) ट्रेलिंग कंट्रोल कैरेक्टर लाइन से छीन लिए जाएंगे
debham

4
इसके अलावा, टेक्सट को स्पष्ट रूप से अपरिभाषित किया जाना चाहिए क्योंकि फ़ाइल को पढ़ने से पहले केवल 1 पंक्ति खाली है।
डेन्हम

यहां स्ट्रिंग को ट्रिम करने के लिए कुछ अतिरिक्त सुझाव दिए गए हैं। echo %texte:~3%उदाहरण के लिए पहले तीन वर्ण छोड़ देंगे। यह तब उपयोगी है जब आप BOM के साथ UTF-8 फ़ाइल पढ़ रहे हों।
करगवारे

22

उह तुम लोग ...

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:\>

2
यदि फ़ाइल में 11 से अधिक लाइनें हैं, तो यह पहले से अधिक प्रिंट करेगा, जैसे: 1 :, 11 :, 21 :, आदि ...
Cesar Romero

1
अच्छा कैच सीज़र! मैं हमेशा उद्धरण से बचने की कोशिश करता हूं क्योंकि वे मुझे परेशान करते हैं, लेकिन इस मामले में यह एक बुरा विचार था। ठीक करने के लिए, findstr "^1:"डबल कोट्स की गर्मी और सुरक्षा को बदलना और हासिल करना। या, यदि आप मेरे जैसे उद्धरणों का तिरस्कार करते हैं और खतरनाक रूप से जीना चाहते हैं, तो उपयोग करेंfindstr /b 1:
अमित नायडू

4
यदि आप इसे बिना उद्धरण चिह्नों और / b विकल्प के बिना चाहते हैं तो बस कैरट से बच: findstr ^^1
डेबनहम

ग्रेट हिंट डेबेनहम, सीएमडी में भागने से हमेशा बच निकलता है। वैसे, कृपया बड़ी फ़ाइलों के लिए इस पद्धति का उपयोग न करें, यह वास्तव में संपूर्ण फ़ाइल को पढ़ता है और बहुत अक्षम है। इस समाधान के लिए मेरे एकमात्र मानदंड ए थे) यह एक एकल पंक्ति बी होना चाहिए) यह याद रखना या याद रखना और टाइप करना आसान होना चाहिए, कॉपी-पेस्ट सी नहीं) कोई बाहरी उपकरण नहीं। set /pसमाधान कहीं अधिक बड़ी फ़ाइलों के लिए कुशल है।
अमित नायडू

2
इसके अलावा, यह आपके द्वारा वास्तव में इच्छित पाठ की पंक्ति के लिए लाइन नंबर को प्रस्तुत करता है! इसलिए इतना उपयोगी नहीं है जब आपको केवल पाठ की आवश्यकता हो।
रॉस प्रेसर

11

आप इसे आजमा सकते हैं:

@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
)

1
इससे मुझे वह सुराग मिल गया जिसकी मुझे जरूरत थी लेकिन यह बहुत सही नहीं था। सुनिश्चित नहीं है कि उचित प्रक्रिया क्या थी लेकिन मैंने इस समाधान को अंतिम समाधान में शामिल किया। देखें stackoverflow.com/questions/130116#130209
जेसी वोग

2
इस समाधान की समस्या यह है कि यह नईलाइन के बजाय अंतरिक्ष पर परिसीमन करता है, और आपके पास रिक्त स्थान के साथ फ़ाइल नाम नहीं हो सकता है। आप लूप के लिए डेलिम्स और यूज़बैक विकल्प के साथ इन मुद्दों को ठीक कर सकते हैं।
indiv

मेरे लिए काम किया है, लेकिन मुझे "delims="रिक्त स्थान के साथ पूर्ण फ़ोल्डर नामों को प्रिंट करने के लिए जोड़ना था ।
GChuf


4

अन्य लोगों के जवाब पर थोड़ा निर्माण। अब आपको उस फ़ाइल को निर्दिष्ट करने की अनुमति देता है जिसे आप पढ़ना चाहते हैं और चर जिसे आप परिणाम में लाना चाहते हैं:

@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.

3

एक लाइनर, ">" के साथ रीडायरेक्ट के लिए उपयोगी है:

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

2

इसे इस्तेमाल करे

@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

1

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'th, टेक्स्ट फ़ाइल की पहली और अंतिम पंक्ति कैसे मिलेगी? " Http://www.netikka.net/tsneti/info/tscmd023.htm

[जोड़ा गया 28-अगस्त -2018] एक भी हो सकता है:

@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

सेट / पी टेक्सट = <file.txt शायद सबसे अच्छा समाधान है जिसे प्रस्तुत किया गया है। इस थ्रेड में @Spaceballs द्वारा। सामान्य तौर पर, मैं सेट / पी "टेक्स" = <"file.txt" लिखूंगा लेकिन वह बिंदु के बगल में है। ध्यान दें कि यहां तक ​​कि यह समाधान जहर चरित्र की समस्याओं के लिए प्रवण है, यानी फ़ाइल.txt के आधार पर विफल हो सकता है।
टिमो सालमी

1

एक फ़ाइल Cicle करने के लिए ( file1.txt, file1[1].txt, file1[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एक संकेत के माध्यम से पूछता है; हालांकि फ़ाइल पुनर्निर्देशन के साथ <इसे तुरंत प्रॉम्प्ट पर फ़ाइल की सामग्री मिलती है; और जैसे ही पहली लाइन समाप्त होती है, उस बिंदु पर प्रॉम्प्ट पढ़ना बंद कर देता है, और इस तरह वेरिएबल में सिर्फ पहली लाइन को स्टोर करता है।
sdbbs

0

ध्यान दें, बैच फ़ाइल दृष्टिकोण DOS कमांड प्रोसेसर के लिए लाइन सीमा तक सीमित होगा - देखें कमांड लाइन की लंबाई सीमा क्या है?

इसलिए यदि ऐसी फाइल को संसाधित करने की कोशिश की जा रही है जिसमें 8192 अक्षर अधिक हों, तो स्क्रिप्ट सिर्फ उन्हें छोड़ देगी क्योंकि मूल्य आयोजित नहीं किया जा सकता है।


0

दूसरा रास्ता

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

2
मैं एक अंतिम उपाय के रूप में .bat फ़ाइल का उपयोग करने की सलाह दूंगा। यदि यह सब संभव है, तो हमेशा एक "वास्तविक" स्क्रिप्टिंग भाषा का उपयोग करने का प्रयास करें: पॉवर्सशेल, डब्ल्यूएसएच, पायथन ... लेकिन कुछ भी।
paulsm4

2
बैच वह बुरा नहीं है (जब आप जानते हैं, आप क्या करते हैं? हर दूसरी भाषा की तरह)। hhay: आपका कोड काम नहीं कर रहा है।
Stephan


1
@ paulsm4: बैच फ़ाइलों में क्या गलत है? यह विंडोज के सभी स्वादों पर काम करता है, और इसमें एक अद्वितीय विशेषता है, जिसे विलंबित एक्सपेंसेशन कहा जाता है, जिससे 3 पार्टी सॉफ्टवेयर स्थापित किए बिना जादू होने की अनुमति मिलती है, जब तक आप इसे समझते हैं। क्या आप जानते हैं कि आप Powershell & dotNet से बहुत पहले DOS & बैच फ़ाइलों के साथ TCP / IP पा सकते हैं?
जोम्बा

0

यहां एक वर्कअराउंड का उपयोग किया गया है 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")


-1

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

पहली पंक्ति प्रिंट करता है, फिर अगली पंक्ति को प्रिंट करने के लिए एक कुंजी दबाने के लिए उपयोगकर्ता की प्रतीक्षा करता है। आवश्यक लाइनें प्रिंट करने के बाद, बंद करने के लिए Ctrl + C दबाएं।

@ रो प्रेसर: यह विधि केवल लाइनों को प्रिंट करती है, न कि लाइन नंबरों को प्रीपेंड करती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.