Capellini
13.03.2011, 11:22:25
Mam dwa duże pliki (pierwszy: 40 MB, drugi - 20 MB) zawierające pewne dane w takiej postaci:
pole1 [tabulator] pole2 [tabulator] pole3
Chciałbym do każdego wiersza dodać jeszcze jedno pole i dla każdego wiersza nadać wartość dla tego pola, a następnie posortować względem tego dodanego pola i wyświetlić powiedzmy 1000 pierwszych wierszy.
Więc chcę to wrzucić do bazy danych, tylko jak?
Czytać pliki po kawałku. Przecież w PHP jest cała masa funkcji, które pozwalają Ci wczytywać plik mniejszymi porcjami, np. po 2 KB, albo po jednej linijce. Wtedy taki plik, o ile będziesz regularnie kasować już wczytane i przetworzone dane, może mieć nawet i gigabajt.
Capellini
15.05.2011, 16:28:15
To mógłbyś dać jakiegoś linka do opisu funkcji, które pozwolą mi wczytać za pierwszym wywołaniem skryptu pierwsze 2 KB, później drugie 2 KB itd. ? Bo jakoś nie mogę znaleźć.
kiler129
15.05.2011, 16:57:55
$fr = fopen("wejsciowy.csv", "r"); $fw = fopen("wyjsciowy.csv", "a");
if(!$fr) trigger_error("Nie moge otworzyc pliku wejsciowego", E_USER_ERROR
); if(!$fw) trigger_error("Nie moge otworzyc pliku wyjsciowego", E_USER_ERROR
);
}
Kod dopisze [tabulator] pole4 do każdego wiersza z pliku wejsciowy.csv i zapisze wynik do wyjsciowy.csv.
Capellini
17.05.2011, 19:54:09
Czym ten kod, który napisałeś, różni się właściwie od zwykłego wczytania i zapisania pliku? Chodzi mi o wczytanie najpierw fragmentu pliku od 0 KB do 2 KB, później od 2 KB do 4 KB itd.
everth
17.05.2011, 20:32:07
Zapytam inaczej - czy ta baza w którą chcesz to wrzucić to baza np. hostingu? Czy chodzi ci ogólnie o import CSV do bazy (może być lokalna instancja) ?
To jest właśnie zwykłe czytanie pliku. A różni się tym, że tutaj w pamięci w każdym momencie działania skryptu masz jedynie dwukilobajtowy fragment pliku w pamięci, natomiast to, co nazywasz "normalnym" czytaniem, choć wcale nim nie jest, wczytuje wszystko za jednym zamachem.
molis85
18.05.2011, 14:28:56
jak masz dostęp do konsoli to szybciutko możesz przerzucić taki pliczek csv do bazy poleceniem mysqlimport ...
kiler129
18.05.2011, 14:47:14
Cytat(Capellini @ 17.05.2011, 20:54:09 )

Czym ten kod, który napisałeś, różni się właściwie od zwykłego wczytania i zapisania pliku? Chodzi mi o wczytanie najpierw fragmentu pliku od 0 KB do 2 KB, później od 2 KB do 4 KB itd.
Tym, że jak powiedziano w ramie zalega mi max 8KB danych (1 linijka).
Jeśli chcesz dokładnie 2KB to zmieniasz fgets($res) na fread($res, 2048);
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.