Archief - Batch file .txt rownr toevoegen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

deathdevil

Legacy Member
Hey Iedereen,

Voor mijn thesis moet ik verschillende programma's gebruiken die elk andere input nodig hebben, in .txt formaat. Het is me gelukt dit te regelen voor alles behalve 1 techniek, deze eist dat ik per regel in de .txt een rowid meegeef, bv IDx.

Door wat te zoeken ben ik er toe gekomen dat ik dit zou kunnen doen door middel van een windows batch file. Alleen vind ik nergens deftige tutorials, het is allemaal spelen met echo's maar weinig concreets. Ik weet ook niet welke taal het juist is? Al ga ik ervan uit dat het C++ is...

Wat ik zou moeten gedaan krijgen:
- Per file (t'zijn er uiteraard een hele hoop) een teller starten (vanaf 1)
- Lijn lezen
- ID'teller' concatenate met gelezen lijn
- teller increment
- lijn lezen
- ...
tot einde van file.

Is er per toeval iemand die een deftige tutorial hiervoor weet, of nog simpeler, dit even kan schrijven? (stel dat het makkelijk te doen is, ik heb er geen idee van). Mijn windows versie is XP professionel overigens, uit de info die ik vond begrijp ik dat dit uitmaakt?

Als ik me vergis en dit makkelijker op een andere manier kan is dat uiteraard ook uiterst welkom :)

Alvast bedankt!
mvg,
Daan

Parnakra

Legacy Member
Numbering Lines with FIND

/edit: hm, niet meteen hetgeen je zoekt. Maar ik raad je aan om wat te googlen op 'dos batch programming'. Al zou je hetzelfde (veel makkelijker) kunnen doen met pakweg perl, python of ruby - deze zijn wel niet standaard geïnstalleerd op een windows OS.

deathdevil

Legacy Member
Hey Parnakra,

Bedankt voor het antwoord.
Ik heb nog wat verder gezocht en het is me gelukt om een rownr toe te voegen dmv Python code!

Nu heb ik dat wel manueel gedaan dmv volgende code:
infile=open('2_2000.txt', 'r')
lines=infile.readlines()
infile.close()
outtext = ['%d %s' % (i, line) for i, line in enumerate(lines)]
outfile = open("3_2000.txt","w")
outfile.writelines(outtext)
outfile.close()

Ik zou nu dus een loop moeten schrijven die dat doet voor alle files die ik heb. Alleen heb ik de indruk dat dit niet echt simpel werkt in Python, hij laat bv niet toe code te kopieren... vreemd allemaal.

deathdevil

Legacy Member
Ga vanmiddag proberen, wederom bedankt!

En te zeggen dat ik dacht er gewoon met matlab vanaf te komen voor mijn thesis ;)

deathdevil

Legacy Member
Sorry, ik ontbreek nog een stukje van de puzzel!

Het openen zou nu moeten lukken, maar ik moet ze wel nog wegschrijven natuurlijk.
De naam van de weggeschreven file zou moeten zijn infile_example.txt
Als ik volg wat er gebeurt gaat dit niet mogelijk zijn zomaar met de glob.glob?
Any hints hier?

Super bedankt alvast voor de hulp!

Code voorlopig:
Code:
import os, glob
 
path = '/Thesis/Thesis code/trepan-1.0'
for infile in glob.glob( os.path.join(path, '*.arff') ):
print "current file is: " + infile
lines=infile.readlines()
infile.close()
outtext = ['%d %s' % (i, line) for i, line in enumerate(lines)]
outfile = open("???","w")
outfile.writelines(outtext)
outfile.close()

Messias.

Legacy Member
In Python is witruimte significant. Alles wat je per for x in y: wil uitvoeren moet geïndenteerd zijn. Alles wat je niet onder de for-lus wil uitvoeren moet niet geïndenteerd zijn. Op deze manier dus:

Code:
files = glob.glob('whatever')

for file in files:
    # code per file
    lines = file.readlines()
    # enz.

# code buiten de for-lus

Volgens mij moet je bovendien ook de file waar je naar wil wegschrijven openen in append-modus ('a') in plaats van write-modus ('w') als ik je goed begrijp waar je naartoe wil.

deathdevil

Legacy Member
Hey Messias,

bedankt voor het antwoord, ik vroeg me al af hoe hij wist wat in de loop zat aangezien ik hem niet moest sluiten, bedankt voor de verduidelijking!

Het doel is om een 80-tal files te wijzigen, maar niet te appenden in 1 file, maar wel degelijk 80 files te houden... dat is wat ik hierboven probeerde uit te leggen :)

deathdevil

Legacy Member
Woohoo :)
Het is gelukt na nog een beetje hulp van de python tutors :)

Code die het uiteindelijk doet:
Code:
import os, glob

fileprefix = 'TRE_'
path = '/Thesis/Thesis code/trepan-1.0/example UCI/'
for infile in glob.glob( os.path.join(path, '*.arff') ):
	print "current file is: " + infile
	lines= open(infile).readlines()
	(filepath, filename) = os.path.split(infile)
	outname = ('%s%s'%(fileprefix,filename)) 
	outtext = ['%d %s' % (i, line) for i, line in enumerate(lines)]
	outfile = open(outname, "w")
	outfile.writelines(outtext)
	outfile.close()

bedankt voor de hulp!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan