Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Duże pliki
Forum PHP.pl > Forum > PHP
Capellini
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?
Zyx
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
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
  1. $fr = fopen("wejsciowy.csv", "r");
  2. $fw = fopen("wyjsciowy.csv", "a");
  3.  
  4. if(!$fr) trigger_error("Nie moge otworzyc pliku wejsciowego", E_USER_ERROR);
  5. if(!$fw) trigger_error("Nie moge otworzyc pliku wyjsciowego", E_USER_ERROR);
  6.  
  7. while(!feof($fr)) {
  8. fwrite($fw, fgets($fr)."\tpole4\n");
  9. }
  10.  
  11. fclose($fr);
  12. fclose($fw);


Kod dopisze [tabulator] pole4 do każdego wiersza z pliku wejsciowy.csv i zapisze wynik do wyjsciowy.csv.
Capellini
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
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) ?
Zyx
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
jak masz dostęp do konsoli to szybciutko możesz przerzucić taki pliczek csv do bazy poleceniem mysqlimport ...
kiler129
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.