使用批处理实现解析文本数据文件写入数据库表

本文介绍一种使用批处理脚本从文本数据文件中读取数据并将其写入数据库表的方法。该方法适用于批量处理卡交易文件,包括读取配置文件、处理文件名、解析数据、动态替换控制文件中的值等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文实例讲述通过批处理解析文本数据文件写入数据库表的实现方法。分享给大家供大家参考。具体实现方法如下:

@echo off & setlocal enabledelayedexpansion
:param
    set data_path=
    set /p data_path=请输入卡交易文件存放目录:
    @echo 你输入的卡交易文件存放目录为:"%data_path%" 
    call :stringlenth "%data_path%" num
    ::@echo 字符串长度为:%num% 
    ::判断是否输入了文件存放路径,否则提示重新输入
    if %num% gtr 0 ( goto upload ) else goto param

:stringLenth
    ::字符串长度计算子程序 
    set thestring=%~1
    ::@echo 字符串 %thestring%
    ::参数%1 为字符串"%str%",%~1则去掉"%str%"的双引号。 
    if not defined theString (
       ::设置如果字符串为空,长度为0
        set Return=0
        set %2=0
        goto :eof
    )
    set Return=0

:stringLenth_continue
    set /a Return+=1
    set thestring=%thestring:~0,-1%
    ::偏移量为 1,截取倒数第1位前的所有字符
    if defined thestring goto stringLenth_continue
    ::参数%2 为返回变量 num的名称,不能含空格或特殊字符
    if not "%2"=="" set %2=%Return%
    goto :eof 

:upload  
::读取config.ini配置文件
for /f  "tokens=1,2 delims==" %%b in (%~dp0conf\conf.ini) do (
  if "%%b"=="user" set user=%%c
  if "%%b"=="pass" set pass=%%c
  if "%%b"=="dbsid" set dbsid=%%c 
)
::循环处理卡交易文件
for /r %data_path% %%a in (R92EXTCI*) do (
 set houzui=%%~xa
 ::备份数据文件,先判断时候有后缀,由于sqlldr默认数据文件默认后缀为.dat
 if not defined houzui (
    copy %%a %%a.dat && move %%a %~dp0databak\prda\%%~na
    ::获取第一行的数据,用于后续截取一些数据
    set /p firstline=<%%a.dat
    set datafile=%%a.dat
 ) else (
    set /p firstline=<%%a
    set datafile=%%a
 )
 ::头记录编号1
 set headno1=!firstline:~28,16!
 ::头记录编号2
 set headno2=!firstline:~54,11!
 ::不带后缀文件名
 set filename=%%~na

 ::获取应该导入总条数
 for /f "delims=" %%i in (!datafile!) do set lastline=%%i
 set totalnum=!lastline:~60,3!

  ::实现动态把控制文件的headno1val、headno2val、filenameval替换为实际值
  REM for /f "delims=" %%i in ('type %~dp0ctl\prda\garance_prda_sqlldr_sample.ctl') do (
      REM set str=%%i
      REM 变量嵌套替换命令
      REM call, set str=%%str:headno1val=!headno1!%%
      REM call, set str=%%str:headno2val=!headno2!%%
      REM call, set str=%%str:filenameval=!filename!%%
      REM echo !str!
      REM echo !str!>> %~dp0ctl\prda\garance_prda_sqlldr.ctl
  REM )

 ::相关数据插入数据库表 
 sqlplus !user!/!pass!@!dbsid! @%~dp0sql\prda\upload_pada_head.sql !filename! !headno1! !headno2! !totalnum!

 sqlldr userid=!user!/!pass!@!dbsid! control=%~dp0ctl\prda\garance_prda_sqlldr.ctl data=!datafile! log=%~dp0log\garance_prda.log bad=%~dp0bad\garance_prda.bad

 ::开始进行检查
 if exist %~dp0data_temp\prda\checkexist.txt del %~dp0data_temp\prda\checkexist.txt
 %~dp0bin\sqluldr264.exe user=!user!/!pass!@!dbsid! sql=%~dp0sql\prda\garance_prda_checkexist.sql  file=%~dp0data_temp\prda\checkexist.txt head=no>nul
 for /f %%n in (%~dp0data_temp\prda\checkexist.txt) do ( 
    set isexist=%%n
 )

 ::计算实际导入笔数
 if exist %~dp0data_temp\prda\checknum.txt del %~dp0data_temp\prda\checknum.txt
 %~dp0bin\sqluldr264.exe user=!user!/!pass!@!dbsid! sql=%~dp0sql\prda\garance_prda_checknum.sql  file=%~dp0data_temp\prda\checknum.txt head=no>nul
  for /f %%n in (%~dp0data_temp\prda\checknum.txt) do ( 
    set checknum=%%n
 )

 if exist %~dp0data_temp\prda\checkexist.txt (
      if exist %~dp0data_temp\prda\checknum.txt (
         if !isexist! gtr 0  (
           echo "=================文件信息已经存在,请核对后再重新导入======================="
         ) else (       
                sqlplus !user!/!pass!@!dbsid! @%~dp0sql\prda\appendprda.sql
                echo "=================ATM文件%%a已经导入======================="         
                if !checknum! neq !totalnum! (
                    echo "=================应导入!totalnum!,实际导入!checknum!,请核对!!======================="
                )else (
                   echo "=================成功导入笔数!checknum!======================="
                )
         )
      ) else (
         echo =================检查成功导入笔数时出错=======================  
      ) 
 ) else (
     echo =================检查文件信息是否已存在时出错=======================  
 )
::等待一会,后续进行下个文件的解析导入
 ping 127.0.0.1 -n 8 >nul

)
pause
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值