0

0

解析固定宽度数据文件(.out)并转换为CSV或SQL格式的教程

碧海醫心

碧海醫心

发布时间:2025-11-26 13:45:15

|

1031人浏览过

|

来源于php中文网

原创

解析固定宽度数据文件(.out)并转换为CSV或SQL格式的教程

本教程详细介绍了如何处理无分隔符的固定宽度`.out`数据文件,并将其高效转换为`.txt`、csv或sql文件。文章核心展示了如何利用php的`unpack()`函数解析固定长度字段,以及如何通过`fputcsv()`将其导出为带分隔符的csv格式。教程强调了准确定义字段结构的重要性,并探讨了空值处理及进一步转换为sql的思路。

理解固定宽度数据文件

固定宽度数据文件(通常以.out为扩展名,但并非强制)是一种特殊的数据存储格式,其特点是记录中的每个字段都占据预定义的固定字符长度,而不是通过特定的分隔符(如逗号、制表符或竖线)来区分。这意味着,即使字段内容较短,也会用空格或其他填充字符补齐到指定长度。这种格式在遗留系统和某些数据交换场景中仍然常见,但由于缺乏显式分隔符,解析起来相对复杂。

例如,以下是两个固定宽度数据记录的示例:

I299207075410 07  OCCLUSAL-HP                        LIQ17%                          LMedicis              B000001000000000001EA 8428010080529100   1072363   20030101000000016750000000016750000000000167500200101010000000000000000000000000000000001218000000000000000000000000000000000000000000000000020021231262436018510(W/BRUSH APPLICATOR)     TPLIQ     
 299207085060R01  LUZU                               CRE1%                           SBausch               C000006000000000001EA 8404080054930829 1 1309011   20180105000000590530000000098421700000000902967000000000000000000000000000000000000000000000000000000000000000000000000000000                                     TPCRE     

在这些记录中,每个字段的起始位置和长度都是固定的。即使是空白字符,也可能构成某个字段的一部分,或者表示该字段的空值(NULL)。例如,第一个字符可能是一个长度为1的字段,在第二条记录中显示为空格,这可能表示一个NULL值。

使用PHP解析固定宽度数据

PHP提供了一个强大的函数unpack(),它能够根据预定义的格式字符串从二进制字符串(或这里是文本行)中提取数据。这非常适合处理固定宽度数据。

1. 定义字段结构

解析固定宽度数据的首要任务是准确定义每个字段的名称及其对应的长度。这是整个过程中最关键的一步,需要根据实际数据文件的布局进行精确配置。

我们将使用一个关联数组来存储这些定义,其中键是字段名,值是字段的长度:

 1,   // 例如,第一个字段长度为1
    'field2_identifier' => 12,  // 第二个字段长度为12
    'field3_code'       => 5,   // 第三个字段长度为5
    'field4_category'   => 35,  // ...以此类推
    'field5_value'      => 32,
    'field6_description'=> 22,
    'field7_product_id' => 22,
    'field8_serial_num' => 17,
    'field9_status'     => 2,
    'field10_quantity'  => 10,
    'field11_long_data' => 186,
    'field12_type'      => 10
];

// 根据字段定义生成 unpack 格式字符串
$unpack_format_array = [];
foreach ($fields as $name => $length) {
    // 'A' 格式符表示一个NUL填充的字符串,长度为 $length
    // unpack 会从输入字符串中精确提取 $length 个字符
    $unpack_format_array[] = 'A'.$length.$name;
}
$unpack_string = implode('/', $unpack_format_array);

// 存储解析后的数据
$data = [];
foreach ($raw as $line) {
    // 使用 unpack 函数解析每一行数据
    $parsed_row = unpack($unpack_string, $line);
    $data[] = $parsed_row;
}

// 打印解析后的数据结构,用于调试
// var_dump($data);

?>

代码解释:

CopyWeb
CopyWeb

AI网页设计转换工具,可以将屏幕截图、网站URL转换为代码组件

下载
  • file('data.out', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES):读取整个.out文件,将每一行作为数组的一个元素。FILE_IGNORE_NEW_LINES选项会移除每行末尾的换行符,FILE_SKIP_EMPTY_LINES会跳过空行。
  • $fields:这是核心配置数组。你需要根据你的.out文件格式,精确地定义每个字段的名称(键)和它所占据的字符长度(值)。例如,如果你的第一个字段是ID,长度为10,那么就写 'id' => 10。
  • 'A'.$length.$name:unpack()函数使用格式字符串来指导解析。A是一个格式字符,表示提取一个NUL填充的字符串。$length指定了要提取的字符数量,$name则是提取后在结果数组中对应的键名。implode('/', ...)将所有字段的格式字符串连接起来,形成一个完整的unpack格式字符串。
  • unpack($unpack_string, $line):对文件中的每一行应用生成的格式字符串,将其解析成一个关联数组,其中键是你在$fields中定义的字段名,值是提取到的字符串。

将解析数据导出为CSV文件

一旦数据被成功解析为PHP数组,将其导出为CSV(或其他带分隔符的文本文件)就变得非常简单。PHP的fputcsv()函数专门用于将数组写入文件作为CSV行。

代码解释:

  • fopen($export_filename, "w"):以写入模式打开一个新文件(如果文件不存在则创建,如果存在则清空)。
  • fputcsv($export_file, array_keys($fields), $delimiter):首先写入CSV文件的标题行。array_keys($fields)会从$fields数组中提取所有字段名,作为CSV的列头。
  • fputcsv($export_file, $row, $delimiter):在循环中,对于每个解析后的数据行($row),fputcsv()将其转换为一个以指定$delimiter分隔的字符串,并写入到$export_file中。
  • fclose($export_file):完成写入后,关闭文件句柄,释放资源。

将数据导入到SQL数据库

将解析后的数据导入SQL数据库有两种主要方法:

  1. 通过生成的CSV文件导入: 大多数数据库管理系统(如MySQL, PostgreSQL, SQL Server)都提供了从CSV文件导入数据的功能。例如,MySQL可以使用LOAD DATA INFILE语句。这种方法简单高效,尤其适用于大数据量。

    -- MySQL 示例
    LOAD DATA INFILE '/path/to/your/data.csv'
    INTO TABLE your_table_name
    FIELDS TERMINATED BY '|' -- 与fputcsv中使用的分隔符一致
    ENCLOSED BY '"'          -- 如果字段值包含分隔符,通常会用引号括起来
    LINES TERMINATED BY '\n' -- 行结束符
    IGNORE 1 LINES;          -- 如果CSV文件包含标题行,则跳过第一行
  2. 通过PHP直接生成SQL INSERT语句: 你也可以在PHP脚本中,遍历解析后的数据,为每一行动态生成INSERT语句,并通过数据库连接执行这些语句。这种方法提供了更大的灵活性,例如可以在插入前进行数据验证或转换。

    setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $table_name = "your_table_name";
    $columns = implode(', ', array_keys($fields)); // 字段名列表
    $placeholders = implode(', ', array_fill(0, count($fields), '?')); // 占位符列表
    
    $insert_sql = "INSERT INTO {$table_name} ({$columns}) VALUES ({$placeholders})";
    $stmt = $pdo->prepare($insert_sql);
    
    foreach ($data as $row) {
        // 将关联数组的值转换为索引数组,以便与 prepare 语句的占位符匹配
        $values = array_values($row);
        $stmt->execute($values);
    }
    
    echo "数据已成功导入到SQL数据库。\n";
    
    ?>

    这种方法需要处理数据库连接、错误处理和SQL注入防护(使用预处理语句)。

关键注意事项

  1. 字段定义的准确性: 这是整个转换过程的基础。任何字段长度或顺序的错误都将导致数据解析失败或数据错位。务必仔细核对.out文件的布局规范。
  2. 空值(NULL)的处理: 在固定宽度文件中,空白字符通常表示NULL值。unpack()函数会按原样提取这些空格。在后续处理(如导入数据库)时,你可能需要额外的逻辑来将全为空格的字符串转换为实际的NULL值。例如:
    foreach ($data as &$row) { // 使用引用以便修改原始数组
        foreach ($row as $key => &$value) {
            if (trim($value) === '') { // 如果去除空格后为空
                $value = null; // 将其设为PHP的null
            }
        }
    }
    unset($value); // 解除引用
  3. 编码问题: 确保.out文件的字符编码与PHP脚本处理的编码一致。如果文件是UTF-8,PHP脚本也应以UTF-8处理。
  4. 文件路径与权限: 确保PHP脚本有权限读取.out文件和写入导出的CSV文件。
  5. 大规模数据处理: 对于非常大的.out文件,一次性将整个文件读入内存(file()函数)可能会消耗大量资源。在这种情况下,可以考虑逐行读取文件(fgets()或SplFileObject)以减少内存占用

总结

通过PHP的unpack()函数,我们可以有效地解析复杂的固定宽度数据文件,将其转换为结构化的数组。结合fputcsv(),我们可以轻松地将这些数据导出为CSV等带分隔符的格式,从而为后续的数据分析、处理或导入到关系型数据库奠定基础。成功的关键在于对源文件字段结构的精确理解和定义。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2449

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1571

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1473

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

951

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1414

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1305

2023.11.13

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 787人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号