Πώς να κάνετε βρόχο μέσω κάθε γραμμής σε ένα αρχείο κειμένου χρησιμοποιώντας ένα αρχείο δέσμης παράθυρα;

ψήφοι
181

Θα ήθελα να μάθω πώς να βρόχο μέσα από κάθε γραμμή σε ένα αρχείο κειμένου χρησιμοποιώντας ένα αρχείο δέσμης των Windows και να επεξεργάζεται κάθε γραμμή του κειμένου διαδοχικά.

Δημοσιεύθηκε 01/10/2008 στις 01:01
πηγή χρήστη
Σε άλλες γλώσσες...                            


12 απαντήσεις

ψήφοι
4

Αν έχετε NT-οικογένεια των Windows (το ένα με cmd.exeτο κέλυφος), δοκιμάστε την εντολή ΓΙΑ / F .

Απαντήθηκε 01/10/2008 στις 01:03
πηγή χρήστη

ψήφοι
50

Από την αναφορά των Windows γραμμή εντολών:

Για να αναλύσει ένα αρχείο, αγνοώντας σχολίασε γραμμές, πληκτρολογήστε:

for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k

Αυτή η εντολή αναλύει κάθε γραμμή στο myfile.txt, αγνοώντας γραμμές που αρχίζουν με άνω τελεία και περνώντας το δεύτερο και το τρίτο token από κάθε γραμμή προς το ΓΙΑ σώμα (οι μάρκες οριοθετείται με κόμμα ή κενά). Το σώμα του για τις αναφορές δήλωση% i για να πάρει το δεύτερο δείγμα,% j για να πάρει το τρίτο token και% k για να πάρει όλες τις υπόλοιπες μάρκες.

Αν τα ονόματα των αρχείων που σας προμηθεύσει περιέχει κενά, σημάδια χρήση εισαγωγικά γύρω από το κείμενο (για παράδειγμα, «Όνομα αρχείου»). Για να χρησιμοποιήσετε εισαγωγικά, θα πρέπει να χρησιμοποιήσετε usebackq. Σε αντίθετη περίπτωση, τα εισαγωγικά ερμηνευθεί ως ορίζει ένα κυριολεκτικό string για να αναλύσει.

Με την ευκαιρία, μπορείτε να βρείτε το αρχείο βοήθειας γραμμής εντολών για τα περισσότερα συστήματα Windows σε:

 "C:\WINDOWS\Help\ntcmds.chm"
Απαντήθηκε 01/10/2008 στις 01:06
πηγή χρήστη

ψήφοι
8

Εδώ είναι ένα αρχείο bat έγραψα για να εκτελέσει όλες τις δέσμες ενεργειών SQL σε ένα φάκελο:

REM ******************************************************************
REM Runs all *.sql scripts sorted by filename in the current folder.
REM To use integrated auth change -U <user> -P <password> to -E
REM ******************************************************************

dir /B /O:n *.sql > RunSqlScripts.tmp
for /F %%A in (RunSqlScripts.tmp) do osql -S (local) -d DEFAULT_DATABASE_NAME -U USERNAME_GOES_HERE -P PASSWORD_GOES_HERE -i %%A
del RunSqlScripts.tmp
Απαντήθηκε 01/10/2008 στις 01:08
πηγή χρήστη

ψήφοι
242

Οι παρακάτω θέσεις βοήθησε σε μεγάλο βαθμό, αλλά δεν κάνει ό, τι ανέφερα στην ερώτησή μου, όπου είχα ανάγκη να επεξεργαστεί το σύνολο της γραμμής στο σύνολό της. Εδώ είναι αυτό που βρήκα για να εργαστούν.

for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

Το μάρκες λέξη-κλειδί με αστερίσκο (*) θα τραβήξει όλο το κείμενο για το σύνολο της γραμμής. Εάν δεν μπορείτε να βάλετε στο αστερίσκος που θα τραβήξει μόνο την πρώτη λέξη στη γραμμή. Υποθέτω ότι έχει να κάνει με κενά.

Για Εντολή στο TechNet

Εκτιμώ όλα τα μηνύματα!

Απαντήθηκε 02/10/2008 στις 17:33
πηγή χρήστη

ψήφοι
13

Ή, μπορείτε να εξαιρέσετε τις επιλογές σε εισαγωγικά:

FOR /F %%i IN (myfile.txt) DO ECHO %%i
Απαντήθηκε 12/08/2009 στις 12:18
πηγή χρήστη

ψήφοι
28

Σε ένα αρχείο δέσμης που ΠΡΕΠΕΙ να χρησιμοποιήσετε %%αντί για %: (Τύπος help for)

for /F "tokens=1,2,3" %%i in (myfile.txt) do call :process %%i %%j %%k
goto thenextstep
:process
set VAR1=%1
set VAR2=%2
set VAR3=%3
COMMANDS TO PROCESS INFORMATION
goto :EOF

Αυτό που κάνει: Η «θέτουν: διαδικασία %% i %% ι %% k» στο τέλος του για την εντολή περνά τις πληροφορίες που αποκτήθηκαν στο για εντολή από myfile.txt στη «διαδικασία» «ρουτίνα».

Όταν χρησιμοποιείτε το για εντολή σε ένα πρόγραμμα παρτίδα, θα πρέπει να χρησιμοποιήσετε διπλό% πινακίδες για τις μεταβλητές.

Οι ακόλουθες γραμμές περνούν αυτές τις μεταβλητές από το για την εντολή για τη διαδικασία «διαδικασία» και σας επιτρέπουν να επεξεργαστούμε αυτές τις πληροφορίες.

set VAR1=%1
 set VAR2=%2
 set VAR3=%3

Έχω κάποιες αρκετά προηγμένες χρήσεις της ακριβούς ρύθμισης που θα είναι πρόθυμοι να μοιραστούν αν τα άλλα παραδείγματα που απαιτούνται. Προσθήκη στο EOL ή Delims σας ανάλογα με τις ανάγκες του μαθήματος.

Απαντήθηκε 04/05/2010 στις 13:39
πηγή χρήστη

ψήφοι
21

Βελτίωση το πρώτο «ΓΙΑ / F ..» απάντηση: Τι έπρεπε να κάνω ήταν να καλέσει την εκτέλεση κάθε σενάριο που αναφέρονται στο MyList.txt, γι 'αυτό λειτούργησε για μένα:

for /F "tokens=*" %A in  (MyList.txt) do CALL %A ARG1

--OR, αν θέλετε να το κάνετε κατά τη διάρκεια της πολλές σειρές:

for /F "tokens=*" %A in  (MuList.txt) do (
ECHO Processing %A....
CALL %A ARG1
)

Επεξεργασία: Το παράδειγμα που δίνεται ανωτέρω είναι για την εκτέλεση ΓΙΑ βρόχου από εντολών εντολών? από μια παρτίδα-script, ένα επιπλέον% χρειάζεται να προστεθεί, όπως φαίνεται παρακάτω:

---START of MyScript.bat---
@echo off
for /F "tokens=*" %%A in  ( MyList.TXT) do  (
   ECHO Processing %%A.... 
   CALL %%A ARG1 
)
@echo on
;---END of MyScript.bat---
Απαντήθηκε 23/01/2012 στις 16:36
πηγή χρήστη

ψήφοι
1

Modded παραδείγματα εδώ στη λίστα Rails εφαρμογές μας για Heroku - χάρη!

cmd /C "heroku list > heroku_apps.txt"
find /v "=" heroku_apps.txt | find /v ".TXT" | findstr /r /v /c:"^$" > heroku_apps_list.txt
for /F "tokens=1" %%i in (heroku_apps_list.txt) do heroku run bundle show rails --app %%i

Πλήρης κωδικό εδώ .

Απαντήθηκε 11/01/2013 στις 17:27
πηγή χρήστη

ψήφοι
19

@ MrKraus του απάντηση είναι διδακτική. Επιπλέον, επιτρέψτε μου να προσθέσω ότι αν θέλετε να φορτώσετε ένα αρχείο που βρίσκεται στον ίδιο κατάλογο με το αρχείο δέσμης, πρόθεμα το όνομα του αρχείου με το% ~ dp0. Εδώ είναι ένα παράδειγμα:

cd /d %~dp0
for /F "tokens=*" %%A in (myfile.txt) do [process] %%A

Σημείωση: Εάν το όνομά σας αρχείο ή κατάλογο (π.χ. myfile.txt στο παραπάνω παράδειγμα) έχει ένα χώρο (π.χ. «file.txt μου» ή «c: \ Files πρόγραμμα»), χρήση:

for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A

, Με τον τύπο λέξη-κλειδί καλώντας το typeπρόγραμμα, το οποίο εμφανίζει τα περιεχόμενα ενός αρχείου κειμένου. Εάν δεν θέλετε να υποστούν την επιβάρυνση του καλώντας την εντολή είδος θα πρέπει να αλλάξετε τον κατάλογο στον κατάλογο του αρχείου κειμένου. Σημειώστε ότι ο τύπος εξακολουθεί να απαιτείται για ονόματα αρχείων με κενά.

Ελπίζω ότι αυτό βοηθά κάποιον!

Απαντήθηκε 28/05/2013 στις 11:49
πηγή χρήστη

ψήφοι
13

Η αποδεκτή απάντηση είναι καλή, αλλά έχει δύο περιορισμούς.
Είναι σταγόνες κενές γραμμές και γραμμές που ξεκινούν με;

Για να διαβάσετε τις γραμμές οποιουδήποτε περιεχομένου, θα πρέπει να έχετε την καθυστερημένη Τεχνικό εναλλαγή επέκταση.

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ text.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

Findstr χρησιμοποιείται για να πρόθεμα κάθε γραμμή με τον αριθμό γραμμής και ενός κόλου, τόσο άδειο γραμμές δεν είναι πια άδειο.

DelayedExpansion πρέπει να απενεργοποιηθεί, κατά την πρόσβαση στην %%aπαράμετρο, αλλιώς θαυμαστικά !και CARETS ^θα χαθούν, καθώς έχουν ιδιαίτερη σημασία σε αυτή την κατάσταση.

Αλλά για να αφαιρέσετε τον αριθμό της γραμμής από τη γραμμή, η καθυστερημένη επέκταση πρέπει να ενεργοποιηθεί.
set "var=!var:*:=!"αφαιρεί όλα μέχρι το πρώτο κόλον (χρησιμοποιώντας delims=:θα αφαιρέσει επίσης όλα τα άνω και κάτω τελείες στην αρχή μιας γραμμής, όχι μόνο το ένα από findstr).
Η endlocal απενεργοποιεί και πάλι την καθυστερημένη ανάπτυξη για την επόμενη γραμμή.

Ο μόνος περιορισμός είναι τώρα το όριο μήκους γραμμής ~ 8191, αλλά δεν φαίνεται να υπάρχει τρόπος να ξεπεραστεί αυτό.

Απαντήθηκε 18/07/2013 στις 11:52
πηγή χρήστη

ψήφοι
0

Η αποδεκτή anwser χρησιμοποιώντας cmd.exeκαι

for /F "tokens=*" %F in (file.txt) do whatever "%F" ...

λειτουργεί μόνο για «κανονική» αρχεία. Αποτυγχάνει παταγωδώς με τεράστια αρχεία.

Για μεγάλα αρχεία, μπορεί να χρειαστεί να χρησιμοποιήσετε Powershell και κάτι σαν αυτό:

[IO.File]::ReadLines("file.txt") | ForEach-Object { whatever "$_" }

ή αν έχετε αρκετή μνήμη:

foreach($line in [System.IO.File]::ReadLines("file.txt")) { whatever "$line" } 

Αυτό λειτούργησε για μένα με ένα αρχείο 250 MB που περιέχει πάνω από 2 εκατομμύρια γραμμές, όπου η for /F ...εντολή κόλλησε μετά από μερικές χιλιάδες γραμμές.

Για τις διαφορές μεταξύ των foreachκαι ForEach-Object, βλέπε Γνωριμία με foreach και foreach-αντικειμένου .

(credits: Διαβάστε γραμμή του αρχείου από γραμμή σε PowerShell )

Απαντήθηκε 14/10/2018 στις 18:39
πηγή χρήστη

ψήφοι
0

Καλή @jeb απάντηση.
Εδώ είναι ένας τρόπος χωρίς να με καθυστέρηση επέκτασης:

Για να εκτυπώσετε όλες τις γραμμές (συμπεριλαμβανομένων των κενών και εκείνους που αρχίζουν με? Ερωτηματικό)

for /f "tokens=1* delims=]" %i in ('type "full path\te mp.txt" ^| find /v /n ""') do if "%j"=="" (echo:)else echo %j

Για την εκτύπωση μόνο μη-κενές γραμμές, συμπεριλαμβανομένων εκείνων που ξεκινούν με? Ερωτηματικό: (δηλ αφαιρέστε κενές γραμμές.)

for /f "eol= delims=" %i in ('type "full path\te mp.txt"') do echo %i

Για να εκτυπώσετε μόνο εκείνες τις γραμμές που ξεκινούν με? Ερωτηματικό:

findstr /b ";" < "te mp.txt"

Σε αντίθεση με προηγούμενες απαντήσεις, δεν χρειάζεται να usebackqόταν ονόματα έχουν κενά. Για αρχεία δέσμης, διπλάσιο των ποσοστό% πινακίδες για δείκτες τοποθέτησης στο ΓΙΑ βρόχο.

Δοκιμάστηκε σε Win 10

Απαντήθηκε 02/02/2020 στις 11:42
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more