2012-07-12 33 views
5

Tôi có một file .txt mà có một loạt các dữ liệu định dạng trong nó trông giống như sau:tải cố định chiều rộng, không gian giới hạn tập tin .txt vào 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 
... 

Tôi cố gắng để tải mỗi hàng như một mục nhập vào một bảng trong cơ sở dữ liệu của tôi, trong đó mỗi cột là một trường khác nhau. Tôi gặp sự cố khi nhận mySQL để tách riêng tất cả dữ liệu một cách chính xác. Tôi nghĩ rằng vấn đề xuất phát từ thực tế là không phải tất cả các con số đều được tách biệt với một khoảng trắng không đổi.

Dưới đây là hai câu hỏi tôi đã cố gắng cho đến nay (Tôi cũng đã thử một số biến thể của các truy vấn):

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; 

Bất kỳ ý tưởng làm thế nào để có được điều này để làm việc?

+0

Ngoài ra, chú ý đến không gian màu trắng duy nhất ở phần đầu của mỗi dòng. – bddicken

Trả lời

10

Đây là những gì chúng tôi gọi là bản ghi "chiều rộng cố định" và LOAD DATA không hoạt động tốt với chúng. Tùy chọn:

  1. Dọn dẹp dữ liệu trong Excel đầu tiên, hoặc
  2. tải lên các dữ liệu vào một bảng tạm thời chỉ có 1 cột, xô đẩy toàn bộ một dòng văn bản vào cột đó. Sau đó, bạn có thể sử dụng SUBSTR()TRIM() để cắt ra các cột bạn cần vào bảng cuối cùng.
  3. Hoặc với biến người dùng (@row), bạn có thể thực hiện tất cả trong câu lệnh 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, tuyệt. Truy vấn này có hoạt động tốt hơn nếu chỉ có một khoảng trống ở giữa mọi giá trị không? Nó có lẽ sẽ không khó để viết một kịch bản làm cho khoảng cách phù hợp hơn. – bddicken

+0

Thông thường, bạn nên sử dụng dấu phẩy, dấu chấm phẩy, tab hoặc đường ống ('|') để tách các trường trong tệp văn bản (CSV = giá trị được phân tách bằng dấu phẩy là định dạng phổ biến nhất). Sau đó, LOAD DATA có thể xử lý chúng một cách dễ dàng. –

+0

Chà, tùy chọn 3 (và truy vấn đi kèm với nó) hoạt động hoàn hảo, cảm ơn! – 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)) 
) 
Các vấn đề liên quan