Hozzászólások
Hali,
a következö problémám akadt egy szövegfile manipuláció során:
adott a szöveg aminek "oszlopai" vesszövel elválassztottak. A szöveg egyik oszlopát akarom manipulálni,de nem tudom egyértelmüen azonositani mert az oszlopokon belül lehetnek szabad szövegek is és abbani is simán elöfordulhat veszö.Annyi az eltérés, hogy ezek idézöjelek között vannak, de az awk-t vagy a cut-ot ezek "nem zavarják" és simán elcsúszik minden oszlop.
Itt van egy példa mire gondolok hátha igy világosabb :
111, '2 22 ',3,'444'
123, 'aaa ', 5,'b, c'
444,'d,d/s', 6,'eee'
Ez ugye 4 oszlop lenne,de itt 'b, c' és itt 'd,d/s' bezavarnak a szövegen belüli vesszök.
Esetleg ha tud valaki valami kézenfekvö megoldást a dologra azt megköszönném.
Üdv.
MZ.
- A hozzászóláshoz be kell jelentkezni
Ha a valódi adat is ilyen, akkor én nem vesszőt állítanék be mezőelválasztónak a cut/awk-ban, hanem aposztrófot (Te ugyan idézőjelnek mondtad, de szóval azt, amiben a sztringek vannak). a Példád alapján neked a 2. mezőt kell elővenned (esetleg a 4.) És a kivágott mezőben aztán már vacakolhatsz a vesszőkkel is. Abban az esetben, ha a 2. és 4. mező nem mindig van idézőjelben (vagy esetleg egyéb mezők is lehetnek, de hol van hol nincs), akkor szerintem a standard UNIX eszközökkel nem nagyon lehet megoldani (illetve valszeg awk-kal saját daraboló fv-t írva igen)
- A hozzászóláshoz be kell jelentkezni
bocs aposztof a stringhatárolo,de ez azért nem jo mezöválasztonak mert ha ez string oszlop üres akkor itt null van aposztrof nélkül pl.:
111, '2 22 ',3,'444'
123, 'aaa ', 5,'b, c'
444,'d,d/s', 6,'eee'
555, null, 7, '1,dd'
és már megint bukik a mutatvány.
Probáltam az awk nak az FS=", " | ", [1-9]" | ", \'" .. meg hasonlo konbináciokat, de ezek mind elöfordulnak az idézöjelen belül is sajna.
Remélem nincs igazad és valahogy ki lehet valahogy bányászni álltalános Unix eszközökkel.(én még nem csalodtam bennük)
Tudom én hogy eszerübb lenne az életem valami egzotikus mezöszeparátorral de hát ez van.
- A hozzászóláshoz be kell jelentkezni
[quote:01ffb7394d="morvaiz"]
111, '2 22 ',3,'444'
123, 'aaa ', 5,'b, c'
444,'d,d/s', 6,'eee'
555, null, 7, '1,dd'
Tudom én hogy eszerübb lenne az életem valami egzotikus mezöszeparátorral de hát ez van.
Felkeltette az erdeklodesem ez a dolog, igy irtam ra egy java programot (Cserelo.java):
import java.util.*;
import java.io.*;
import java.lang.*;
public class Cserelo
{
public static void main(String []argv)
{
try{
boolean bInsideApostrof = false;
BufferedReader in;
System.out.println(argv[0]);
in = new BufferedReader(new FileReader(argv[0]));
while(in.ready()) {
String line = in.readLine();
for(int i=0; i<line.length(); i++)
{
Character ch = new Character(line.charAt(i));
if(ch.compareTo(new Character('\'')) == 0)
{
bInsideApostrof = !bInsideApostrof;
} else if(ch.compareTo(new Character(',')) == 0)
{
if(!bInsideApostrof)
ch = '\t';
}
System.out.print(ch);
}
System.out.println();
}
in.close();
} catch(Exception e) {
System.out.println("Kivetel tortent!");
System.out.println(e);
} finally {
}
}
}
Ha ezt leforditod (javac Cserelo.java), es elinditod (java Cserelo adatok.txt), akkor az aposztrofon kivuli vesszoket tab-ba alakitja, igy a cut, awk mar jol fog mukodni. A tabokat pedig konnyu visszatenni vesszove a sed-del.
Persze ugyanez a karakterenkenti vizsgalat szerintem menne awk-val is, de most ez a java dolog jutott eszembe.
(Sajnos a program tabulalasa nem latszik, mert nem tudom hogyan tudnam elerni itt a hup-on, hogy a szokzoket is jelenitse meg a programsorok elejen. )
Mate
- A hozzászóláshoz be kell jelentkezni
[quote:4b576160f1="morvaiz"]bocs aposztof a stringhatárolo,de ez azért nem jo mezöválasztonak mert ha ez string oszlop üres akkor itt null van aposztrof nélkül pl.:
111, '2 22 ',3,'444'
123, 'aaa ', 5,'b, c'
444,'d,d/s', 6,'eee'
555, null, 7, '1,dd'
és már megint bukik a mutatvány.
akkor a ",null" stringet elotte csereld
",'null'" stringre
es ujra helyes a mutatvany ;)
- A hozzászóláshoz be kell jelentkezni
@labadimate:kösz,modjuk a javát nem akartam belekeverni.
A TAB/"," csere nem a legjobb mert a szövegbe az is simán van TAB-karakter söt soremelés is,bár modjuk nem kell feltétlenuk TAB-ra lehet másra is cserélni, ennyiben jo a dolog.
@rka:igen, ha jobb megoldásd nincs akkor lehet több lépésben kell megoldanom (csak utánna vissza is kell konvertálni) bár ez nem a legelegánsabb :)
- A hozzászóláshoz be kell jelentkezni
[quote:0134c4caa4="morvaiz"]A szöveg egyik oszlopát akarom manipulálni,de nem tudom egyértelmüen azonositani mert az oszlopokon belül lehetnek szabad szövegek is és abbani is simán elöfordulhat veszö.
Szerintem folyamatosan olvasd a szöveget bájtonként, közben figyeld a terminátort, ami jelen esetben a vessző, és még olyat is csinálj, hogy az idézőjelhez állítgass szemafort, ami mutatja, hogy mikor kell a terminátort lekezelni és mikor átlépni. Lehet, hogy awk-val egyszerűbben meg lehet csinálni, de ez tuti.
- A hozzászóláshoz be kell jelentkezni