Vervangen van woorden in een tekstbestand adhv tabel

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • gambieter
  • Registratie: Oktober 2006
  • Niet online

gambieter

Just me & my cat

Topicstarter
Ik gebruik een programma dat stambomen maakt na vergelijking van bacteriele chromosomen, om te laten zien hoe verwant ze zijn. De output-bestanden (platte tekst) zien er als volgt uit:
code:
1
((((((074acfjltu:100.0,202acfjmpu:100.0):100.0):100.0, etc )

Doordat de software een oud programma gebruikt voor het maken van de stambomen, heeft het een limitatie overgenomen uit die module, en dat is dat alleen de eerste 10 karakters van de naam van elke bacterie wordt gebruikt, en natuurlijk uniek moet zijn. Dat heb ik opgelost door de bestandsnamen te coderen tot "074acfjltu", "202acfjmpu" etc.

Dat werkt verder goed, maar ik wil graag de namen kunnen aanpassen in kopieen van het bestand, met een tabel waar ik de naam kan aanpassen. Als het in Notepad++ of in Word/Excel kan, dan zou dat fijn zijn.

Ik dacht dat dit wel iets zou zijn als "regular expressions with lookup table" met "replace in text file" zou zijn, maar helaas geeft dat geen nuttige links, ze gaan allemaal over enkelvoudige replace acties, niet met een lookup tabel.

Iemand suggesties of de betere zoektermen? :)

I had a decent lunch, and I'm feeling quite amiable. That's why you're still alive.


Acties:
  • 0 Henk 'm!

  • gekkie
  • Registratie: April 2000
  • Laatst online: 17-05 22:49
Het is me niet echt duidelijk wat je nou door wat vervangen zou willen aan de hand van een tabel met welke inhoud. Maar buiten dat .. waarom niet een klein stukje perl, python of een andere scripttaal naar keuze.
Waar je je tekst bestand + je lookup table in frut (bijvb als csv als je daarna weer graag naar excel wil) ?

Acties:
  • 0 Henk 'm!

Anoniem: 26306

Dit zou ik inderdaad doen met een simpel script of een combinatie van wat tools als sed en awk onder Linux.
Het probleem van grafische programma's en editors is dat ze zo slecht te gebruiken zijn bij het automatiseren van taken.

Excel kan dit op zich ook wel maar is niet de beste tool.

awk 'BEGIN { printf "sed " } {printf " -e \"s/%s/%s/g\"", $1, $2} END {printf " input.txt\n"}' lookuptable.txt | sh

Acties:
  • 0 Henk 'm!

  • gambieter
  • Registratie: Oktober 2006
  • Niet online

gambieter

Just me & my cat

Topicstarter
Waarom niet in Perl of Python? Heel eerlijk antwoord: omdat ik daar ondanks meerdere pogingen en een cursus nog steeds de ballen verstand van heb :X .

Wat ik wil veranderen is:
code:
1
((((((074acfjltu:100.0,202acfjmpu:100.0):100.0):100.0, etc )

in
code:
1
((((((H_pylori_OK113_hspEAsia:100.0,H_pylori_N6_hpEurope:100.0):100.0):100.0, etc )

waarbij de CSV lookup file dus is:
code:
1
2
074acfjltu,H_pylori_OK113_hspEAsia
202acfjmpu,H_pylori_N6_hpEurope

I had a decent lunch, and I'm feeling quite amiable. That's why you're still alive.


Acties:
  • 0 Henk 'm!

  • Icekiller2k6
  • Registratie: Februari 2005
  • Laatst online: 12:01
Hoeveel regels per bestand?

Hackerspace Brixel te Hasselt (BE) - http://www.brixel.be


Acties:
  • 0 Henk 'm!

  • gambieter
  • Registratie: Oktober 2006
  • Niet online

gambieter

Just me & my cat

Topicstarter
Wisselend. Het tekstbestand is een enkele regel, dwz alles is een doorlopende regel (het heet het "Newick" format).

Ik heb bestanden waar het om 100 woorden gaat, maar ook bestanden waar het om 4000-5000 woorden gaat.
Anoniem: 26306 schreef op zaterdag 22 november 2014 @ 00:59:
Dit zou ik inderdaad doen met een simpel script of een combinatie van wat tools als sed en awk onder Linux.
Het probleem van grafische programma's en editors is dat ze zo slecht te gebruiken zijn bij het automatiseren van taken.

Excel kan dit op zich ook wel maar is niet de beste tool.

awk 'BEGIN { printf "sed " } {printf " -e \"s/%s/%s/g\"", $1, $2} END {printf " input.txt\n"}' lookuptable.txt | sh
Dank, ga ik naar kijken :)

[ Voor 56% gewijzigd door gambieter op 22-11-2014 01:07 ]

I had a decent lunch, and I'm feeling quite amiable. That's why you're still alive.


Acties:
  • 0 Henk 'm!

Anoniem: 26306

Het is maar een voorbeeld van hoe je met weinig code ongeveer kunt doen wat je wilt. Met een Perl of Python script kun je natuurlijk iets meer zinvolle foutafhandeling doen. De string operaties zijn vrij simpel, dus de code zal ook niet al te ingewikkeld worden.

Acties:
  • 0 Henk 'm!

  • gambieter
  • Registratie: Oktober 2006
  • Niet online

gambieter

Just me & my cat

Topicstarter
Ik realiseer me trouwens dat ik het kan scripten waarbij ik gewoon een template maak waar alleen de in- en output in gekopieerd moet worden, maar dat is wel erg eh.... low-tech :p

Ik probeer hier ook wat van te leren, eerdere vragen over dergelijke dingen die ik hier stelde waren erg goed voor dat :)

[ Voor 25% gewijzigd door gambieter op 22-11-2014 01:47 ]

I had a decent lunch, and I'm feeling quite amiable. That's why you're still alive.


Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Binnen een VBA host kan het wel, maar laten we zeggen dat de vba-syntax hiervoor tamelijk omslachtig is.

Je zou dan iets krijgen als
Visual Basic:
1
2
3
4
5
6
7
8
9
10
Dim v As Variant
Dim newick As String
Dim regel As String

Open "foo.csv" For Input As #1
While Not EOF(1)
   Line Input #1, regel
   v = Split(regel, "'")
   Replace newick, v(0), v(1)
Wend


Waarbij je voor replace newick, als je dit onder Word zou draaien, het ingebakken zoek- en vervang commando zou kunnen gebruiken. Mooi is het niet echt...

Het wordt al eleganter als je gebruik maakt van het filesystemobject, maar ik zou idd eerder de moeite steken in iets als powershell, python, perl of zelfs vb-script. Met een beetje sprokkelen hoe je een lus opzet om regel voor regel een bestandje uit te lezen, daar de twee parameters uithaalt en vervolgens een replaceaktie op een bestand mee uitvoert knip en plak je zo'n scriptje zo in elkaar. :)

[ Voor 10% gewijzigd door Lustucru op 22-11-2014 13:11 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Nu online
Als je onder Linux werkt, dan zou dit volgens mij met sed goed moeten kunnen.
Stel dat je 1 directory hebt met de legenda inhoud "legenda.csv" en meerdere files met data, allemaal eindigend op ".txt":

Eerst de CSV file omschrijven naar sed commando's:
code:
1
sed 's#^#s/#;s#,#/#;s#$#/#' legenda.csv > legenda.sed

Dat veranderd de legenda naar iets als
code:
1
2
s/074acfjltu/H_pylori_OK113_hspEAsia/
s/202acfjmpu/H_pylori_N6_hpEurope/

Daarna alle files in de directory search & replacen met die lijst van sed commando's:
code:
1
sed --in-place=bck --file=legenda.sed *.txt


Natuurlijk heb je onder Linux ook andere mogelijkheden zoals eerder genoemd - AWK, perl bijvoorbeeld. Wat dat betreft is het bij dit soort vragen handig om de omgeving te noemen waarin je dit het liefste doet.

Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

vanaalten schreef op zaterdag 22 november 2014 @ 08:58:
Wat dat betreft is het bij dit soort vragen handig om de omgeving te noemen waarin je dit het liefste doet.
Hij schrijft toch dat hij dat het liefste met een office-host doet? ;)

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Nu online
Lustucru schreef op zaterdag 22 november 2014 @ 13:12:
[...]

Hij schrijft toch dat hij dat het liefste met een office-host doet? ;)
Oeps, je hebt gelijk.. Nou ja, misschien dat ik 'm nu op het idee van upgraden gebracht heb. :+

Acties:
  • 0 Henk 'm!

  • gambieter
  • Registratie: Oktober 2006
  • Niet online

gambieter

Just me & my cat

Topicstarter
Op zich maakt het me niet uit, hoor. Ik run momenteel Windows/Office (Notepad++ is ook goed), maar ook een virtual machine met BioLinux en ik gebruik Cygwin. Als het maar werkt :p

I had a decent lunch, and I'm feeling quite amiable. That's why you're still alive.


Acties:
  • 0 Henk 'm!

  • gambieter
  • Registratie: Oktober 2006
  • Niet online

gambieter

Just me & my cat

Topicstarter
Icekiller2k6 is zo aardig geweest om een tooltje te schrijven voor Windows dat precies doet wat ik wil, met een makkelijke userinterface _/-\o_ d:)b

Met toestemming van hem hier de downloadlink, voor hen die geinteresseerd zijn:
https://dl.dropboxusercon...4582/GnomeReplacement.rar

Ik heb het uitgeprobeerd en perfect voor wat ik wil doen *O*

I had a decent lunch, and I'm feeling quite amiable. That's why you're still alive.

Pagina: 1