2012-07-12 7 views
5

Mam .txt plik, który ma kilka sformatowanych danych w nim, że wygląda następująco:Ładowanie stałej szerokości, spacjami plik .txt do mySQL

... 
    1  75175.18  95128.46 
    1 790890.89 795829.16 
    1 875975.98 880914.25 
    8 2137704.37 2162195.53 
    8 2167267.27 2375275.28 
    10 2375408.74 2763997.33 
    14 2764264.26 2804437.77 
    15 2804504.50 2881981.98 
    16 2882048.72 2887921.25 
    16 2993093.09 2998031.36 
    19 3004104.10 3008041.37 
... 

próbuję załadować każdy wiersz jako wpis do tabeli w mojej bazie danych, gdzie każda kolumna jest innym polem. Mam problem z uzyskaniem od MySQL poprawnego rozdzielenia wszystkich danych. Myślę, że kwestia ta wynika z faktu, że nie wszystkie liczby są oddzielone równomierną ilością białej przestrzeni.

Oto dwa pytania próbowałem tak daleko (Próbowałem również kilka odmian tych zapytań):

LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip (slideNum, startTime, endTime) 
SET presID = 1; 


LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip 
FIELDS TERMINATED BY ' ' 
LINES TERMINATED BY '\n' 
(slideNum, startTime, endTime) 
SET presID = 1; 

Wszelkie pomysły jak uzyskać to do pracy?

+0

Również zauważyć pojedyncze spacje na początku każdej linii. – bddicken

Odpowiedz

10

To, co nazywamy rekordami o stałej szerokości, a DANE ŁADOWANIA nie grają z nimi dobrze. Opcje:

  1. oczyścić dane w Excelu pierwszy lub
  2. Załaduj dane do tabeli temp tylko 1 kolumny, wtykając cały wiersz tekstowy do tej kolumny. Następnie możesz użyć SUBSTR() i TRIM(), aby wyciąć potrzebne kolumny w tabeli finałowej.
  3. Lub ze zmiennymi użytkownika (@row) można to wszystko wykonać w instrukcji LOAD DATA.
LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip 
(@row) 
SET slideNum = TRIM(SUBSTR(@row,1,4)), 
    startTime = TRIM(SUBSTR(@row,5,13)), 
    endTime = TRIM(SUBSTR(@row,18,13)) 
; 
+0

OK, fajnie. Czy ta kwerenda działałaby lepiej, gdyby była tylko jedna spacja pomiędzy każdą wartością? Prawdopodobnie nie byłoby trudno napisać skrypt, który spowodowałby, że odstępy byłyby bardziej spójne. – bddicken

+0

Zwykle do oddzielania pól w plikach tekstowych należy używać przecinków, średników, zakładek lub potoków ("|") (najczęściej jest to CSV = wartości rozdzielane przecinkami). Następnie LOAD DATA może z łatwością nimi manipulować. –

+0

Wow, opcja 3 (i zapytanie, które poszło z tym) działało idealnie, dzięki! – bddicken

0
LOAD DATA 
CHARACTERSET AL32UTF8 
INFILE 'DCF Master 14APR2013 VSPCFM_reduced size.txt' 
INTO TABLE EMPLOYEE3 
(
a = TRIM(SUBSTR(@row,1,11)), 
b = TRIM(SUBSTR(@row,33,38)), 
c = TRIM(SUBSTR(@row,70,86)) 
) 
Powiązane problemy