7

我有一个 .txt 文件,其中包含一堆格式化数据,如下所示:

...
   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
...

我试图将每一行作为一个条目加载到我的数据库中的一个表中,其中每一列都是一个不同的字段。我无法让 mySQL 正确分离所有数据。我认为问题在于并非所有数字都以等距的空白量分隔。

到目前为止,这是我尝试过的两个查询(我还尝试了这些查询的几种变体):

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;

任何想法如何让它发挥作用?

4

3 回答 3

15

这些就是我们所说的“固定宽度”记录,而 LOAD DATA 不能很好地配合它们。选项:

  1. 首先清理 Excel 中的数据,或
  2. 将数据加载到只有 1 列的临时表中,将整个文本行推入该列。然后您可以使用SUBSTR()andTRIM()将您需要的列切出到最终表格中。
  3. 或者使用用户变量 (@row),您可以在 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))
;
于 2012-07-12T22:53:29.600 回答
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))
)
于 2014-04-03T16:28:20.097 回答
0
  1. 如果你在 unix/linux 上,那么你可以通过 sed 去掉空格。解决方案在 这里

  2. 您可以以编程方式将空格替换为不同的分隔符。我决定使用PHP,你也可以安全地用Python来做

    <?php
    $mysqli  =  new mysqli(
    "***",
    "***",
    "***",
    "***",
    3306
    );
    mysqli_options($mysqli, MYSQLI_OPT_LOCAL_INFILE, true);
    
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    
    function createTempFileWithDelimiter($filename, $path){
        $content = file_get_contents($filename);
        $replaceContent = preg_replace('/\ +/', ',', $content); // NOT \s+
    
        $onlyFileName = explode('\\',$filename);
    
        $newFileName = $path.end($onlyFileName);
        file_put_contents($newFileName, $replaceContent);
    
        return $newFileName;
    }
    
    $pathTemp = 'C:\\TempDir\\';
    
    $pathToFile = 'C:\\some\\Path\\segmentation.txt';
    
    $file = createFileWithDelimiter($pathToFile, $pathTemp);
    $file = str_replace(DIRECTORY_SEPARATOR, '/', $file);
    
    $sql = "LOAD DATA LOCAL INFILE '".$file."' INTO TABLE `clip` 
        COLUMNS TERMINATED BY ','
        LINES TERMINATED BY '\n'  // or '\r\n'
        (slideNum, startTime, endTime)
        SET presID = 1;";
    
    if (!($stmt = $mysqli->query($sql))) {
        echo "\nQuery execute failed: ERRNO: (" . $mysqli->errno . ") " . $mysqli->error;
    };
    
    unlink($file);
    ?>
    

不要在preg_replace中使用 '/\s+/'因为 \s 匹配任何空白字符(相当于 [\r\n\t\f\v ])并且格式会改变,列和换行符会消失。

于 2021-11-17T01:21:18.770 回答