无忧启动论坛

标题: 批处理csv转换sql文件 [打印本页]

作者: winlong102    时间: 2024-6-25 23:01
标题: 批处理csv转换sql文件
求助,代码如下:
@echo off
setlocal enabledelayedexpansion
set input_file=".\userlist.csv"
if not exist "%input_file%" (
    echo "Error: Input file not found."
    exit /b 1
)

set output_file="userlist.sql"


(for /F "usebackq delims=" %%a in (".\userlist.csv") do (
    set "line=%%a"
    set "line=!line:,=','!"
    echo "INSERT userlist VALUES ('!line:~1,-1!'');"
)) > "%output_file%"

echo "CONVERSION COMPLETE."
endlocal
pause


有两个问题没解决:1、sql的空值的表达格式为NULL,但是批处理生成的是'' 。2、    echo "INSERT userlist VALUES ('!line:~1,-1!'');"这一行,生成的sql文件每一行都前后都会有双引号,实际是不需要的,但批处理语句中去除双引号后,就不工作了。
请大佬不吝指教。

ps 因为传不了附件,我贴出userlist.csv内容,保存记事本后改名即可。
UserId,UserNo,UserPass,UserTName,UserDetail,UserTel,UserMobile,UserEmail,UserIcon,UserSex,UserZW,UserAge,UserRemark,UserAddress,UserWebSite,UserRole,UserLevel,UserState,UserLastLoginDateTime,UserCreateTime,UserRestrict
6,6,d41d8cd98f00b204e9800998ecf8427e,6,,,,,,0,,0,,,,Users,1,1,,,
7,7,d41d8cd98f00b204e9800998ecf8427e,7,,,,,,0,,0,,,,Users,5,1,,,
8,8,d41d8cd98f00b204e9800998ecf8427e,8,,,,,,0,,0,,,,Users,5,1,,,
9,9,d41d8cd98f00b204e9800998ecf8427e,9,,,,,,0,,0,,,,Users,5,1,,,
10,10,d41d8cd98f00b204e9800998ecf8427e,10,,,,,,0,,0,,,,Users,5,1,,,


作者: chenxiz16    时间: 2024-6-26 06:50
感谢分享
作者: yyz2191958    时间: 2024-6-26 07:40
谢谢分享
作者: 红动中国    时间: 2024-6-26 09:31
这个太有用了,谢谢分享
作者: tanglf    时间: 2024-6-26 09:51
这个是要,出个工具APP 更好
作者: wscsd    时间: 2024-6-26 11:26
感谢分享
作者: guong    时间: 2024-6-26 11:50
谢谢分享
作者: sunlenghua    时间: 2024-6-26 15:42
phpmyadmin 等mysql管理工具,直接可以导入 csv,xls 啊! 为啥多一步转换?
作者: newyun    时间: 2024-6-26 16:48
为何不保存为Navicat 任务,定时直接执行
作者: hlstudio    时间: 2024-6-26 18:33
参考一下,直接搬的gpt4o的回复
===================
@echo off
setlocal enabledelayedexpansion

set input_file=".\userlist.csv"
if not exist %input_file% (
    echo Error: Input file not found.
    exit /b 1
)

set output_file="userlist.sql"

(
for /F "usebackq tokens=*" %%a in (%input_file%) do (
    set "line=%%a"
    set "newline="
    for %%b in ("!line:,= !") do (
        if "%%~b"=="" (
            set "newline=!newline!,NULL"
        ) else (
            set "newline=!newline!,'%%~b'"
        )
    )
    set "newline=!newline:~1!"
    echo INSERT INTO userlist VALUES (!newline!);
)) > %output_file%

echo CONVERSION COMPLETE.
endlocal
pause

作者: winlong102    时间: 2024-6-26 21:40
sunlenghua 发表于 2024-6-26 15:42
phpmyadmin 等mysql管理工具,直接可以导入 csv,xls 啊! 为啥多一步转换?

非交互的命令行处理
作者: winlong102    时间: 2024-6-26 21:47
hlstudio 发表于 2024-6-26 18:33
参考一下,直接搬的gpt4o的回复
===================
@echo off

感谢,测试过了,这两个问题都没有解决。如果echo INSERT userlist VALUES... 不加双引号会闪退,加了之后结果如下:
"INSERT INTO userlist VALUES ('UserId UserNo UserPass UserTName UserDetail UserTel UserMobile UserEmail UserIcon UserSex UserZW UserAge UserRemark UserAddress UserWebSite UserRole UserLevel UserState UserLastLoginDateTime UserCreateTime UserRestrict');"
"INSERT INTO userlist VALUES ('6 6 d41d8cd98f00b204e9800998ecf8427e 6      0  0    Users 1 1   ');"
"INSERT INTO userlist VALUES ('7 7 d41d8cd98f00b204e9800998ecf8427e 7      0  0    Users 5 1   ');"
"INSERT INTO userlist VALUES ('8 8 d41d8cd98f00b204e9800998ecf8427e 8      0  0    Users 5 1   ');"
"INSERT INTO userlist VALUES ('9 9 d41d8cd98f00b204e9800998ecf8427e 9      0  0    Users 5 1   ');"
"INSERT INTO userlist VALUES ('10 10 d41d8cd98f00b204e9800998ecf8427e 10      0  0    Users 5 1   ');"

作者: sunlenghua    时间: 2024-6-27 07:05
那就换条思路,直接用mysql命令导入csv得了,免得转换产生二次问题:

LOAD DATA INFILE '/path/to/your/csvfile.csv'
INTO TABLE your_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
作者: hlstudio    时间: 2024-6-27 09:19
sunlenghua 发表于 2024-6-27 07:05
那就换条思路,直接用mysql命令导入csv得了,免得转换产生二次问题:

LOAD DATA INFILE '/path/to/your/ ...

还是搬一下,参考思路
============================
# MySQL 导入命令
MYSQL_CMD="LOAD DATA INFILE '${CSV_FILE}'
INTO TABLE ${TABLE_NAME}
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;"

# 执行 MySQL 导入命令
mysql -u${DB_USER} -p${DB_PASS} -D${DB_NAME} -e "${MYSQL_CMD}"
作者: hlstudio    时间: 2024-6-27 09:23
再搬了一下cmd脚本,自己可以试试,有时要参考思路
========================================
@echo off
setlocal enabledelayedexpansion

set input_file=".\userlist.csv"
if not exist %input_file% (
    echo Error: Input file not found.
    exit /b 1
)

set output_file="userlist.sql"

:: 忽略 CSV 文件的第一行(表头),并处理数据行
(
    for /F "usebackq skip=1 tokens=*" %%a in (%input_file%) do (
        set "line=%%a"
        set "sql_line=INSERT INTO userlist VALUES ("

        set "line=!line:,= , :NULL,!"

        :: 处理每个字段,替换空字段为 NULL,并去掉空格
        for %%b in (!line:) do (
            if "%%b"=="NULL" (
                set "sql_line=!sql_line!NULL,"
            ) else (
                set "sql_line=!sql_line!'%%b',"
            )
        )

        :: 去除末尾的逗号并添加结束括号和分号
        set "sql_line=!sql_line:~0,-1!);"

        :: 输出到 SQL 文件
        echo !sql_line!
    )
) > %output_file%

echo CONVERSION COMPLETE.
endlocal
pause
====================================
代码改动点:
忽略第一行标题:使用 skip=1 忽略 CSV 的第一行标题。
正确处理空值:使用 line=!line:,= , :NULL,! 替换空值为 NULL。
去掉双引号:移除了 echo 语句中的双引号。
作者: ppll2030    时间: 2024-6-27 23:59
本帖最后由 ppll2030 于 2024-6-28 00:45 编辑

理解不太清楚,楼主是要哪一种效果???



脚本修改了上图两个效果。差别在14行

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set input_file=".\userlist.csv"
  4. if not exist "%input_file%" (
  5.     echo "Error: Input file not found."
  6.     exit /b 1
  7. )
  8. set output_file="userlist.sql"
  9. (for /F "usebackq delims=" %%a in (".\userlist.csv") do (
  10.     set "line=%%a"
  11.     set "line=!line:,,=,null,!"
  12.     set "line=!line:,,=,null,!"
  13.     rem 把下方的::两冒号去除,就可以得到图二的效果。
  14.     ::set "line=!line:,= !"
  15.     echo INSERT userlist VALUES ('!line:~0,-1!'^);
  16. )) > "%output_file%"
  17. echo "CONVERSION COMPLETE."
  18. endlocal
  19. ::pause
复制代码




作者: ppll-2030    时间: 2024-6-29 13:38
本帖最后由 ppll-2030 于 2024-6-29 13:56 编辑

唉。账号莫名其妙被关小黑屋。无处伸冤啊重新再给你回一帖吧


晕死了,新人发图还被压缩成缩略图,想看效果图直接复制地址吧: i.postimg.cc/sxHxf4qw/2024-06-29-133131.jpg

对sql不熟悉,理解不清楚楼主的要求。所以根据你们讨论的结果
对楼主的脚本做了修改,做了两个效果。看看哪个才符合吧。
区别在脚本的第16行。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set input_file=".\userlist.csv"
  4. if not exist "%input_file%" (
  5.     echo "Error: Input file not found."
  6.     exit /b 1
  7. )

  8. set output_file="userlist.sql"


  9. (for /F "usebackq delims=" %%a in (".\userlist.csv") do (
  10.     set "line=%%a"
  11.     set "line=!line:,,=,null,!"
  12.     set "line=!line:,,=,null,!"
  13.     rem 把下方的::两冒号去除,就可以得到图二的效果。
  14.     ::set "line=!line:,= !"
  15.     echo INSERT userlist VALUES ('!line:~0,-1!'^);
  16. )) > "%output_file%"

  17. echo "CONVERSION COMPLETE."
  18. endlocal
  19. pause
复制代码





作者: winlong102    时间: 2024-7-1 20:30
ppll-2030 发表于 2024-6-29 13:38
唉。账号莫名其妙被关小黑屋。无处伸冤啊重新再给你回一帖吧

感谢,我需要实现的是这种效果,每个数值有单引号。第一种结果比较接近,但是没有单引号。
INSERT INTO `userlist` VALUES ('111', 'kingloong', 'd41d8cd98f00b204e9800998ecf8427e', '1', 'HELLO', '64303096', '18888888888', '', 'cb481f078b7b4e9ab08349ce7b376fb7', 0, 'leader', 18, 'bang by erma', 'jiangsu', '', 'Users', 1, 1, NULL, NULL, 'NULL');

作者: ppll-2030    时间: 2024-7-1 22:47
本帖最后由 ppll-2030 于 2024-7-1 22:49 编辑
winlong102 发表于 2024-7-1 20:30
感谢,我需要实现的是这种效果,每个数值有单引号。第一种结果比较接近,但是没有单引号。
INSERT INTO  ...

终于到时间可以回复了
每个数值都加了单引号了。文件名userlist作为数值也添加单引号了。
以后只要修改第三行的源文件名就可以联动了。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set input_file="userlist.csv"
  4. for %%a in (%input_file%) do set file_name=%%~na
  5. if not exist "%input_file%" (
  6.     echo "Error: Input file not found."
  7.     exit /b
  8. )
  9. set output_file="userlist.sql"
  10. (for /F "usebackq delims=" %%a in (".\userlist.csv") do (
  11.     set "line=%%a"
  12.     set "line=!line:,,=,null,!"
  13.     set "line=!line:,,=,null,!"
  14.     set "line=!line:,=','!"
  15.     set "line=INSERT '%file_name%' VALUES ('!line:~0!'^);"
  16.     echo !line:''='null'!
  17. )) > "%output_file%"
  18. echo "CONVERSION COMPLETE."
  19. endlocal
  20. pause
复制代码



作者: 财源茂盛    时间: 2024-7-3 08:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: 财源茂盛    时间: 2024-7-3 08:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: 财源茂盛    时间: 2024-7-3 08:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: 财源茂盛    时间: 2024-7-3 08:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: 财源茂盛    时间: 2024-7-4 08:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: a13589    时间: 2024-8-2 21:04
Thank you very much !!




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3