无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3573|回复: 31
打印 上一主题 下一主题

[求助] 批处理csv转换sql文件

[复制链接]
跳转到指定楼层
1#
发表于 2024-6-25 23:01:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
求助,代码如下:
@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,,,

评分

参与人数 1无忧币 +2 收起 理由
yyz2191958 + 2 赞一个!

查看全部评分

2#
发表于 2024-6-26 06:50:46 | 只看该作者
感谢分享
回复

使用道具 举报

3#
发表于 2024-6-26 07:40:45 | 只看该作者
谢谢分享
回复

使用道具 举报

4#
发表于 2024-6-26 09:31:38 | 只看该作者
这个太有用了,谢谢分享
回复

使用道具 举报

5#
发表于 2024-6-26 09:51:07 | 只看该作者
这个是要,出个工具APP 更好
回复

使用道具 举报

6#
发表于 2024-6-26 11:26:29 | 只看该作者
感谢分享
回复

使用道具 举报

7#
发表于 2024-6-26 11:50:53 | 只看该作者
谢谢分享
回复

使用道具 举报

8#
发表于 2024-6-26 15:42:49 | 只看该作者
phpmyadmin 等mysql管理工具,直接可以导入 csv,xls 啊! 为啥多一步转换?

点评

非交互的命令行处理  详情 回复 发表于 2024-6-26 21:40
回复

使用道具 举报

9#
发表于 2024-6-26 16:48:42 | 只看该作者
为何不保存为Navicat 任务,定时直接执行

点评

非交互命令行处理  发表于 2024-6-26 21:48
回复

使用道具 举报

10#
发表于 2024-6-26 18:33:40 | 只看该作者
参考一下,直接搬的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

点评

感谢,测试过了,这两个问题都没有解决。如果echo INSERT userlist VALUES... 不加双引号会闪退,加了之后结果如下: "INSERT INTO userlist VALUES ('UserId UserNo UserPass UserTName UserDetail UserTel UserMo  详情 回复 发表于 2024-6-26 21:47
回复

使用道具 举报

11#
 楼主| 发表于 2024-6-26 21:40:57 | 只看该作者
sunlenghua 发表于 2024-6-26 15:42
phpmyadmin 等mysql管理工具,直接可以导入 csv,xls 啊! 为啥多一步转换?

非交互的命令行处理
回复

使用道具 举报

12#
 楼主| 发表于 2024-6-26 21:47:11 | 只看该作者
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   ');"
回复

使用道具 举报

13#
发表于 2024-6-27 07:05:24 | 只看该作者
那就换条思路,直接用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;

点评

还是搬一下,参考思路 ============================ # MySQL 导入命令 MYSQL_CMD="LOAD DATA INFILE '${CSV_FILE}' INTO TABLE ${TABLE_NAME} FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED  详情 回复 发表于 2024-6-27 09:19
请问如何非交互方法实现呢?这个命令如何写成批处理呢?  发表于 2024-6-27 07:41
回复

使用道具 举报

14#
发表于 2024-6-27 09:19:41 | 只看该作者
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}"

点评

感谢  发表于 2024-6-27 20:35
回复

使用道具 举报

15#
发表于 2024-6-27 09:23:11 | 只看该作者
再搬了一下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 语句中的双引号。

点评

试了一下,批处理生成一个空的sql文件  发表于 2024-6-27 20:35
回复

使用道具 举报

16#
发表于 2024-6-27 23:59:30 | 只看该作者
本帖最后由 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
复制代码



回复

使用道具 举报

17#
发表于 2024-6-29 13:38:17 | 只看该作者
本帖最后由 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
复制代码




点评

感谢,我需要实现的是这种效果,每个数值有单引号。第一种结果比较接近,但是没有单引号。 INSERT INTO `userlist` VALUES ('111', 'kingloong', 'd41d8cd98f00b204e9800998ecf8427e', '1', 'HELLO', '64303096', '  详情 回复 发表于 2024-7-1 20:30
回复

使用道具 举报

18#
 楼主| 发表于 2024-7-1 20:30:34 | 只看该作者
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');
回复

使用道具 举报

19#
发表于 2024-7-1 22:47: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-7 21:53
回复

使用道具 举报

20#
发表于 2024-7-3 08:39:41 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

21#
发表于 2024-7-3 08:39:52 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

22#
发表于 2024-7-3 08:40:04 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

23#
发表于 2024-7-3 08:40:20 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

24#
发表于 2024-7-4 08:19:08 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

25#
发表于 2024-8-2 21:04:21 | 只看该作者
Thank you very much !!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-15 14:57

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表