Import danych z tabeli, parsowanie danych i zapis do mysql...

0

Witam serdecznie...
Mam taki problem do rozwiązania może mi pomożecie...
Mam tabelę z danymi w sumie 58 kolumn i teraz tak chcę to zaimportować do bazy ale... wcześniej chciałbym zrobić porządek z danymi w tabeli...
Mianowicie do kolumny 23 wszystkie dane są uporządkowane czyli nazwa|kod|miasto|ulica|numer budynku|.... i aż do 23 kolumny. od 23 kolumny pojawia się problem mianowicie mam tak że mam nazwę firmy i branżę... tabela wygląda tak:

ID NAZWA ULICA NAZWA1 BRANŻA1 NAZWA2 BRANŻA2 NAZWA3 BRANŻA3 ... NAZWA18 BRANŻA18
1 A x Proj A Projektant Inw D Inwestor Wykasa Wykonawca
2 B y Inw A Inwestor wyk. A Wykonawca Proj X X Projektant
3 C z Inw B Inwestor proj a Projektant WykC Wykonawca
4 D w Proj c Projektant wyk B Wykonawca Inw3 Inwestor
5 E e Proj C Projektant wyk C Wykonawca Inw4 Inwestor

I teraz chcę zaimportować to do mysql. Tylko że jak jest w wierszu 1 załóżmy Projektant o nazwie Proj A to chcę to zaimportować do MYSQL do tabeli PROJEKTANT. Myślałem aby wyrzucić wszystkie wyniki do tablicy i napisać instrukcję if else która by sprawdzała po kolei jeżeli w BRANŻA1 jest projektant to zapisuj w tabeli MYSQL o nazwie PROJEKTANT nazwę NAZWA1 dla ID...

Nie wiem czy jasno się wyraziłem chcę aby tabela miała taką postać ;)

ID NAZWA ULICA PROJEKTANT BRANŻA1 WYKONAWCA BRANŻA2 INWESTOR BRANŻA3 ... NAZWA18 BRANŻA18
1 A x Proj A Projektant Wykasa Wykonawca Inw D Inwestor
2 B y Proj X X Projektant wyk. A Wykonawca Inw A Inwestor
3 C z proj a Projektant WykC Wykonawca Inw B Inwestor
4 D w Proj c Projektant wyk B Wykonawca Inw3 Inwestor
5 E e Proj C Projektant wyk C Wykonawca Inw4 Inwestor

Tylko ja mam w bazie teraz 20.000 rekordów i robić takie coś co miesiąc to masakra będzie ;) 20.000 rekordów po 58 kolumn nawet nie wiem czy komputer mi to ogarnie ;) Aha nadmienię że czasami są wypełnione tylko np kolumny pierwsze 35 reszta pustych a czasami wszystkie 58 mają wpisy...
Czy macie jakieś pomysły jak to uporządkować ?? w prosty i przyjemny sposób...

0

Skasować tą bazę i zaprojektować ją od nowa. Wcześniej przeczytaj cokolwiek o relacyjnych bazach danych. Tworzenie kolumn to bardzo złe rozwiązanie zamiast tego powinny istnieć osobne tabele a co gdy kiedyś trzeba będzie dodać dodatkowe informacje do istniejącej firmy? dodasz kolejne x kolumn?
Niestety nie rozumiem co tutaj opisałeś bo opis różni się od tego co znajduje się w tabelkach. Zrób zrzut struktury tej tabeli z 1 rekordem to nam powie coś więcej i będzie można zaproponować jakiś sensowny podział na mniejsze tabele.

0

Zapoznaj sie z wiedza dotyczaca normalizacji bazy danych. Podrzucam artykul do wikipedii: http://pl.wikipedia.org/wiki/Normalizacja_bazy_danych Dalej polecam poszukania artykulow dotyczacych projektowania bazy danych oraz normalizacji. Dodatkowo:

  • klucze obce (foreign keys)
  • transakcje
  • tabele innodb w mysql
  • triggery

Masz wiec pare tematow do nauczenia sie :)

0

Chyba źle się wyraziłem ta tabela to jest raport z serwisu w xls...
I teraz chce to zaimportować do bazy mysql na własne potrzeby. Strukturę z grubsza mam zrobioną bazy. I teraz mam osobną tabele Projektant osobną Inwestor właśnie tak jak kolega pisał wyżej żeby móc potem uzupełnić to o inne dane np. NIP, osoba kontaktowa itp. już nie mówię o rozbiciu nazwy na ulice, telefon itp. Nie byłoby problemu dla mnie jakby były kolumny pogrupowane w branże a one przybierają różne wartości.
W załączniku wycinek raportu...

0

Trzeba to podzielić na minimum 2 tabele (choć śmiało można pomyśleć o podzieleniu tego bardziej):

  • Inwestycje
  • Wykonawcy
    Pierwsza tabela "Inwestycje" powinna zawierać wszystko to co jest do kolumny "W" w Excelu oraz klucz podstawowy
    W drugiej tabeli "Wykonawcy" trzymać informację:
  • Id wykonawcy (klucz podstawowy)
  • Id inwestycji (klucz obcy wskazujący, której inwestycji się to tyczy)
  • Dane teleadresowe (być może da się je rozdzielić automatycznie na kolumny)
  • branża (jakiś enum lub jeśli będzie tego więcej osobna tabela z ID branży)

Nie twórz na pewno czegoś takiego jak zaproponowałeś w 1 poście. Automatycznie raczej nie uda ci się takiego pliku zaimportować do sql'a

0

Tak mam właśnie mniej więcej zrobione jak mówisz ze samą strukturą nie ma problemu bo wiem co chce mieć jak to będzie rozwijane dlatego zależy mi aby trzymać osobno inwestorów, wykonawców, projektantów etc. żeby tworzyć bazę ich a jeśli pojawią się w przyszłości to wystarczy tylko odwołać się do ich ID... lub ewentualnie wyszukać sobie w jakich inwestycjach dana firma uczestniczyła...
Problemem dla mnie są właśnie te zmienne dane w raporcie żeby ogarnąć dane źródłowe i zaimportować do SQL za jednym razem. Z początku myślałem żeby to wrzucić do tablicy każdy rekord array() a potem sobie tylko te tablice sprawdzać od 23 czy jest to projektant czy inna branża i zapis do roboczej tabeli. I nie wiem czy tego tak nie zrobię np po 300 rekordów... Potem z tej roboczej tabeli już bym sobie wszystkie dane adresowe rozdzielił od nazwy... i dopiero do właściwej bazy zaimportował...

1

A nie możesz napisać skryptu ktory wczyta te dane z excela / csv, sparsuje i je załaduje do bazy? Przecież to nie jest dużo roboty. Robienie tego calkiem na poziomie bazy danych może być bolesne.

0

Ja dopiero od miesiąca uczę się php i mysql ;) i nie wszystko jeszcze ogarniam... co do excel'a to udało mi się na razie wygenerować plik za pomocą klasy PHPExcel z danymi z bazy... ;)
I teraz tak ja tak rozumuję że jeśli nawet mam plik csv to i tak muszę to jakoś obrobić tzn. ja tak myślę najprościej wrzucić dane do tablicy i na tej podstawie obrabiać je... i zapisywac do bazy
Więc najpierw wstępnie chcę oddzielić Architektów, Inwestorów etc. żeby ich zapisać do osobnych tabel i pogrupować w jednej tabeli architekci w drugiej inwestorzy w trzeciej wykonawcy itd... i przypisać do nich ID inwestycji... tylko chwilowo żebym się nie pogubił... bo na końcu to wiadomo że każdy projektant czy inwestor będzie miał swoje ID które będzie przypisywane do inwestycji... np:

if (preg_match_all('#Architek.*#', $tablica[$i][24]) === 1 )
echo $i.'PROJEKTANT: '.$tablica[$i][23].' '.$tablica[$i][ID].'<br/>';
elseif ($tablica[$i][24] === 'Deweloper')
echo $i.'INWESTOR: '.$tablica[$i][23].' '.$tablica[$i][ID].'<br/>';
else
echo $i.'brak<br />';

Jak już to będę miał to wtedy wyodrębnię np. dla tabeli PROJEKTANT osobno nazwę, ulicę, miasto, telefon etc... bo teraz jest wszystko razem w nazwie rozdzielone jest przecinkami i tak przygotowane dane dopiero zaimportuje do finalnej bazy...

Nie wiem może źle rozumuje... Może wy macie jakiś inny sposób jak to szybciej zrobić... chodzi mi o samą strukturę, kolejność kroków nie o gotowy kod.

Pozdrawiam

EDIT:
W sumie jak teraz myślę to może udałoby się od razu zrobić zapis do bazy ale i tak widzę tylko jedno rozwiązanie żeby załadować wszystkie dane do tablicy oczywiście nie wszystkie 20.000 rekordów po 58 tabel :D tylko to podzielić np. po 500 rekordów ;)

{ 
 $rozdzielacz = explode(" ", $tablica[$i][23]);
 echo ($i+1).'PROJEKTANT: '.$rozdzielacz[0].'<br/>';}

jednak poczekam może macie jakieś inne pomysły na mój problem ;)

1

Ja bym za pomocą skryptu wygenerował inserty do bazy. W ten sposób skrypt będziesz mógł odpalać wielokrotnie kiedy tylko pojawią się nowe dane. 20k rekordów to jest nic. Baza to łyknie jak młody pelikan w mgnieniu oka. Jakby to było 20 milionów to mógłbyś się zacząć zastanawiać nad tym jak robić to szybciej ;]

0

I tak chcę zrobić chodziło mi tylko że tak jak w pliku xls który załączyłem wcześniej pierwsze kolumny są oki ale od 23 są schodki bo są dane które chcę wyciągnąć do osobnych tabel i raz jest w komórce projektant, raz inwestor różnie nie ma logiki w tym. I chodziło mi jak przed zapisem do bazy rozbić to odpowiednio i czy mój tok rozumowania jest dobry czyli najpierw do tablicy potem dane sobie już za pomocą if else obrobić i insertami bezpośrednio ładować do bazy... Potem ewentualny update to nie problem bo zmienia się tylko jedna kolumna lub dochodzi całkowicie nowa inwestycja czyli sprawdzenie czy ID inwestycji istnieje w bazie...

1

Jeśli chodzi o samo parsowanie to tak, raczej musisz to zrobić "ręcznie" :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1