kłulik
17.05.2005, 17:17:19
Witam.
Muszę pociąć plik 70MB na części około 5MB, ale tak żeby poszczególne linie nie były pocięte, tzn. żeby nie było tak, że kawałek wiersza jest w jednym pliku, a reszta w drugim. Próbowałem w php za pomocą fopen i explode ale trwało to strasznie wolno. Natomiast Total Commander przecinał mi wiersz w połowie.
Jakieś pomysły lub programy jak to zrobić?
hwao
17.05.2005, 19:50:40
Recznie na oko.
w php sie nie oplaca poniewaz za duzo danych bys chcial wladowac 70mb, mozliwe to jest
ini_set" title="Zobacz w manualu PHP" target="_manual(), ale lepiej to napisac np w c++ prosta sprawa
kłulik
17.05.2005, 20:30:23
Cytat
prosta sprawa
Może dla ciebie, dla mnie nie.
Może znacie jakieś programy, które potną ten plik?
dr_bonzo
17.05.2005, 20:32:41
Ale nie trzeba trzymac calych danych w pamieci:
1. musisz miec zagwarantowane ze kazda linia bedzie < 5MB
$data_count = 0; // zlicza ilosc zapisanych danych do pojedynczego pliku
2. odczytujesz linie
3.
jesli jej dlugosc + $data_count < 5MB to ja dopisujesz do $pliku
i zapisujesz do $pliku; $data_count += dlugosc tej linii
jesli nie zamykasz ten $plik a linie wpisujesz do nowego $pliku., $data_count = dlugosc tej linii
4. itd. az skonczy sie plik zrodlowy
W pamieci trzymasz max 1 linie (choc oczywiscie moze ona byc dowolnie dluga).
kłulik
17.05.2005, 21:06:26
Jedna linia pliku to max. 100 znaków. Ale tych linii jest kilka milionów. Plik waży 70 MB.
W tym pliku mam bazę w formacie CSV. Próbowałem sposobu podobnego do opisanego przez @dr_bonzo tylko nie zapisywałem do kolejnego pliku, tylko explode wiersza i INPUT do MySQLa, ale po 20 min w bazie miałem 50 wierszy.
Szukam programu, który potnie plik na mniejsze, żeby można go było łatwo wsadzić później do bazy.
dr_bonzo
17.05.2005, 21:55:24
W kuncu powiedziales po co ci to
http://dev.mysql.com/doc/mysql/en/load-data.htmlOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
]
[LINES
[STARTING BY '']
[TERMINATED BY '\n']
]
[IGNORE number LINES]
[(col_name,...)]
----
np.:
LOAD DATA INFILE 'gdziestam/data.csv'
INTO TABLE DATA FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY ''' LINES STARTING BY '' TERMINATED BY '\n' ( date, number )
moze kilka minut ci to zajmie
kłulik
17.05.2005, 22:44:29
Dzięki. O to mi chodziło.
Ale mam jeszcze jeden problem. Każdą wartość mam otoczoną przez " (cudzysłów). Co trzeba zrobić żeby go ominąć bo teraz wstawia do bazy wartości razem z ".
dr_bonzo
18.05.2005, 09:04:18
ENCLOSED BY '"'
// bez optionally
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.