Sziasztok! Segítséget kérnék az alábbi feladat megoldásában.
Van egy párszáz soros "A" és "B" csv fájlom az alábbi tartalommal:
"A" fájl
sorszám; név1; név2;
012;nagyon nagy kutya;munka;
019;nagyon kicsi macska;házi
023;nagy pisztoly;sport
stb.
"B" fájl:
sorszám;
017
023
042
stb.
Az "A" fájlban szereplő sorok közül ki kellene egy "C" fájba iratnom azokat a sorokat, amelyekre a "B" fájlban egyezés található. Vagyis ha található az "A"-ban olyan sorszám amely a "B"-ben szerepel akkor azt a sort írja ki.
A példa alapján most a "C" fájlba a "023; nagy pisztoly; sport" sor kerülne.
Köszi!
- 949 megtekintés
Hozzászólások
Köszi, de ez nekem magas.
- A hozzászóláshoz be kell jelentkezni
Pedig tényleg prog.alap :-P
- A hozzászóláshoz be kell jelentkezni
`join`? amennyiben sorba vannak rendezve sorszam szerint a file-ok ugy kb ennyi:
$ cat a.txt
sorszám; név1; név2;
012;nagyon nagy kutya;munka;
019;nagyon kicsi macska;házi
023;nagy pisztoly;sport
$ cat b.txt
sorszám;
017
023
042
$ join -t ';' -j 1 a.txt b.txt
sorszám; név1; név2;;
023;nagy pisztoly;sport
$
ha nincsenek sorbarendezve akkor elobb sorbarendezed majd ugy join :)
- A hozzászóláshoz be kell jelentkezni
Kipróbálom, köszi!
- A hozzászóláshoz be kell jelentkezni
Működik, nagyon köszönöm!
- A hozzászóláshoz be kell jelentkezni
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
data=[]
with open("Afile.csv") as finp:
for line in finp:
line=line.strip()
if line and line[0].isdigit():
data.append(line.split(";"))
with open("Bfile.csv") as findex, open("Cfile.cvs","w") as fout:
for line in findex:
line=line.strip()
if line.isdigit():
for l in data:
if l[0]==line:
fout.write(";".join(l)+"\n")
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Köszi, megnézem ezt is!
- A hozzászóláshoz be kell jelentkezni
A Cfile.cvs üres lesz, lehet én hibázok valahol.
- A hozzászóláshoz be kell jelentkezni
Valószínűleg az a probléma, hogy a B fájlban a sorszám után is van ';'.
Ha így van, akkor az rstrip()-pet be kell ide tenni:
for line in findex:
line=line.strip().rstrip(";")
Szerk.:
Ez a változat elhagyja a split()-et és a joint()-ot:
data=[]
with open("Afile.csv") as finp:
for line in finp:
line=line.strip()
if line.partition(";")[0].rstrip().isdigit():
data.append(line)
with open("Bfile.csv") as findex, open("Cfile.cvs","w") as fout:
for line in findex:
sorsz=line.replace(";","").strip()
if sorsz.isdigit():
for s in data:
if s.startswith(sorsz):
fout.write(s+"\n")
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
Így már jó! Köszi!
- A hozzászóláshoz be kell jelentkezni
grep -f b a
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Ez is jó, köszi!
- A hozzászóláshoz be kell jelentkezni
Ez nem jó, mert ennél a megoldásnál a találat névben is lehet. A kikötés szerint a sorszámokban kell egyezniük.
- A hozzászóláshoz be kell jelentkezni
A feladat szerint az egyik fájlban csak sorszám van, így mással nem lehet találat.
- A hozzászóláshoz be kell jelentkezni
De a "nagyon nagy kutya" helyen lehet "007-es ugynok", es akkor a 007-es ID-ra matchelni fog.
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
- A hozzászóláshoz be kell jelentkezni
Sőt, nemcsak számok, de pontosvessző is szerepelhetne. De párszáz sornál egyszerűbb ezt ellenőrizni, mintsem mindenre felkészülni. (Legalábbis én így csinálnám.)
- A hozzászóláshoz be kell jelentkezni
Vagy kikotod, hogy az ID sor elejere (^) matcheljen ;-ig. Onnantol nem lesz gond.
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
- A hozzászóláshoz be kell jelentkezni
Valóban, erre javítás lehet pl. ez:
sed -i 's/^/\^/
s/$/;/' B
- A hozzászóláshoz be kell jelentkezni
Hol adnak ilyen házit a szünetre...?
- A hozzászóláshoz be kell jelentkezni
Átállás DBF alapú készletnyilvántartóról.
- A hozzászóláshoz be kell jelentkezni
Ebben az esetben megcsinalod az uj rendszert, es annak az adatbazisaba betoltod a jelenlegit mindenfele matcheleses hulyeseg nelkul.
--
When you tear out a man's tongue, you are not proving him a liar, you're only telling the world that you fear what he might say. -George R.R. Martin
- A hozzászóláshoz be kell jelentkezni
Ki kellett szűrni az ezeréves cuccokat.
- A hozzászóláshoz be kell jelentkezni
Ugyan a fenti 2 zseniálisan egyszerű megoldáshoz képest ágyúval verébre, de hasonló feladatokra apache drill. A bemenet csv-ket db táblaként kezeli és műk az sql lekérdezés.
- A hozzászóláshoz be kell jelentkezni