1

我有 ASCII 文件,每行的字符数是静态的,没有分隔符。我想使用 LOAD DATA INFILE 导入我的表。

文件示例:

USALALABAMA                                                               
USARARKANSAS                                                              
USFLFLORIDA                                                               

此表的结构:

country Char(2)
state Char(2)
name Varchar(70)

CREATE TABLE `states` (
  `country` char(2) COLLATE latin1_general_ci NOT NULL,
  `state` char(2) COLLATE latin1_general_ci NOT NULL,
  `name` varchar(70) COLLATE latin1_general_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1_general_ci COLLATE=latin1_general_ci;

是否可以为每列指定开始和结束位置?

4

3 回答 3

1

根据文档,您可以在不使用临时表的情况下加载固定格式的文件。

如果 FIELDS TERMINATED BY 和 FIELDS ENCLOSED BY 值都为空 (''),则使用固定行(非定界)格式。使用固定行格式,字段之间不使用分隔符(但您仍然可以使用行终止符)。相反,使用足够宽的字段宽度来读取和写入列值以容纳字段中的所有值。对于 TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT,字段宽度分别为 4、6、8、11 和 20,无论声明的显示宽度是多少。

这些位置来自列定义,在您的情况下与文件的结构匹配。所以你只需要这样做:

LOAD DATA INFILE 'your_file' INTO TABLE your_table
  FIELDS TERMINATED BY ''
  LINES TERMINATED BY '\r\n'
  SET name = trim(name);
于 2013-09-25T20:31:26.290 回答
1

首先创建一个临时表,将所有行加载到其中,然后您可以将临时表中的数据加载到主表中并使用拆分为字段substring

像这样的东西:

CREATE TEMPORARY TABLE tmp_lines
  (countrystring TEXT);

LOAD DATA INFILE 'yourfilegoeshere' INTO TABLE tmp_lines
  FIELDS TERMINATED BY ''
  LINES TERMINATED BY '\r\n';

INSERT INTO main_table SELECT SUBSTRING(countrystring,1,2), SUBSTRING(countrystring,3, 2), SUBSTRING(countrystring,5) from tmp_lines;
于 2013-09-24T20:09:55.197 回答
1

另一种方法是分配一个变量并将其直接拆分到您的负载中。

LOAD DATA INFILE 'yourfilegoeshere' INTO TABLE main_table
  LINES TERMINATED BY '\r\n' (@_var)
set
  field1=TRIM(SUBSTR(@_var from 1 for 2)),
  field2=TRIM(SUBSTR(@_var from 3 for 2)),
  field3=TRIM(SUBSTR(@_var from 5 for 70));

请确保不要指定任何字段分隔符,否则您将不得不使用更多变量,请注意我正在使用 TRIM 来清理同一语句中的数据。

于 2020-10-29T06:18:27.533 回答