zoukankan      html  css  js  c++  java
  • 详解SQL Server导出表为csv或txt,postgresql导入csv或txt

     目录:

    1、导出SQL Server 数据库的表为 .txt
    2、源表数据记录中带有空白(对源表进行处理)
    3、SQL Server 数据库中的记录去掉前后空白
    4、txt 文件编码 GBK 转成 UTF-8
    5、在 postgresql 新建 test111 数据库,新建表 ods.sl_account_00000000001 (字段与SQL Server对应,注意前后顺序一致)
      5.1、启动 postgresql
      5.2、powershell 连接 postgresql
      5.3、postgresql 操作
      5.4、postgresql 导入 .txt
    6、中间遇到的问题

    1、导出SQL Server 数据库的表为 .txt    <--返回目录

      源表

    CREATE TABLE [dbo].[SL_Account] (
      [id] bigint  IDENTITY(1,1) NOT NULL,
      [company_name] varchar(55) COLLATE Chinese_PRC_CI_AS  NULL,
      [company_code] varchar(11) COLLATE Chinese_PRC_CI_AS  NULL,
      [business_type] varchar(15) COLLATE Chinese_PRC_CI_AS  NULL,
      [merchant_code] varchar(11) COLLATE Chinese_PRC_CI_AS  NULL,
      [account_num] varchar(20) COLLATE Chinese_PRC_CI_AS  NULL,
      [account_type] varchar(10) COLLATE Chinese_PRC_CI_AS  NULL,
      [create_datetime] datetime  NULL,
      [expire_datetime] datetime  NULL,
      [name] varchar(25) COLLATE Chinese_PRC_CI_AS  NULL,
      [phone_num] varchar(20) COLLATE Chinese_PRC_CI_AS  NULL,
      [certificate_num] varchar(20) COLLATE Chinese_PRC_CI_AS  NULL,
      [gender] varchar(10) COLLATE Chinese_PRC_CI_AS  NULL,
      CONSTRAINT [PK__SL_Accou__3213E83FA7F76B5A] PRIMARY KEY CLUSTERED ([id])
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)  
    ON [PRIMARY]
    )  
    ON [PRIMARY]
    GO
    
    ALTER TABLE [dbo].[SL_Account] SET (LOCK_ESCALATION = TABLE)

      新建 sl_account.txt 文件

      开始 => SQL Server Management Studio

      连接

       选中数据库 => 任务 => 导出数据

      代码页若指定 utf-8,后面导出时会报错,(这个和源表的编码有关?)

     

      导出速度和内存有关系(有次打开了之前导出的sl_account.txt, 再次导出的时候比较慢,关掉sl_account.txt后速度很快,170万数据不到20秒)

       导出数据到 sl_account.txt,格式为

    2、源表数据记录中带有空白(对源表进行处理)    <--返回目录

      结果导出的 txt中名字不对,后面也没有分隔符 "|"

     

       修改导出文件的分隔符为 ",",但是还是遇到其他的问题:

       查询数据库的对应的记录,发现有空白(可能是回车)

      导出该条记录的查询结果看看:

    "401244"    "十堰车城通"    "00000000001"    "IC卡"    "00000000001"    "10068263"    "员工卡"    "17/6/2009 08:40:47"    "1/4/2021 00:00:00"    "杨xx"        "8667480
    "    "0"

    3、SQL Server 数据库中的记录去掉前后空白    <--返回目录

    sql server中查询删除含有回车换行制表符的记录
    --   制表符             CHAR(9)    
    --   换行符             CHAR(10)    
    --   回车               CHAR(13)    
    -- 在表 table 中过滤包含回车换行符的字段 filed 的记录
    select * from table where charindex(char(10)+char(13),field)>0  
    -- 在表 table 中把包含回车换行符的字段 filed 的记录的回车换行符去掉
    update table set field=replace(field,char(10)+char(13),'')

      查询 某个字段包含回车换行 的所有记录

    select * from dbo.SL_Account where charindex(char(10),certificate_num)>0
    select * from dbo.SL_Account where charindex(char(13),certificate_num)>0
    select * from dbo.SL_Account where charindex(char(13)+char(10),certificate_num)>0

      上面三条执行得到结果一致,所以空白是 回车换行符

      解决:

    update dbo.SL_Account set name=replace(name,char(13)+char(10),'') where id = 401881
    
    update dbo.SL_Account set name=replace(name,char(13),'') where id = 401881
    update dbo.SL_Account set name=replace(name,char(10),'') where id = 401881
    
    update dbo.SL_Account set name=replace(name,char(9),'') where id = 401881
    update dbo.SL_Account set name=trim(name) where id = 401881
    update dbo.SL_Account set name=replace(name,char(13)+char(10),'')

      其他字段同样处理。下面 sql 可以参考

    -- 替换
    update dbo.SL_Account set name=replace(name,char(13),'')
    update dbo.SL_Account set name=replace(name,char(10),'')
    
    update dbo.SL_Account set name=replace(name,char(9),'')
    update dbo.SL_Account set name=trim(name)
    
      
    -- 查询
    select * from dbo.SL_Account where charindex(char(10),name)>0;
    select * from dbo.SL_Account where charindex(char(10),phone_num)>0;
    select * from dbo.SL_Account where charindex(char(10),certificate_num)>0;
    select * from dbo.SL_Account where charindex(char(10),gender)>0;
    
    select * from dbo.SL_Account where charindex(char(13),name)>0;
    select * from dbo.SL_Account where charindex(char(13),phone_num)>0;
    select * from dbo.SL_Account where charindex(char(13),certificate_num)>0;
    select * from dbo.SL_Account where charindex(char(13),gender)>0;
    
    select * from dbo.SL_Account where charindex(char(13)+char(10),name)>0;
    select * from dbo.SL_Account where charindex(char(13)+char(10),phone_num)>0;
    select * from dbo.SL_Account where charindex(char(13)+char(10),certificate_num)>0;
    select * from dbo.SL_Account where charindex(char(13)+char(10),gender)>0;

    4、txt 文件编码 GBK 转成 UTF-8    <--返回目录

      参考:批量将.txt编码格式转化为utf8

      170万条记录,GBK编码时 187 M, 转成 utf8 后 203 M

    5、在 postgresql 新建 test111 数据库,新建表 ods.sl_account_00000000001 (字段与SQL Server对应,注意前后顺序一致)    <--返回目录

    5.1、启动 postgresql    <--返回目录

      自己写的脚本:.inpg_ctl -D D:/DevTools/pgsql/data -l logfile start

    5.2、powershell 连接 postgresql    <--返回目录

    5.3、postgresql 操作    <--返回目录

      l: 查看所有库

      c test111: 切换库

      新建 test111 数据库,新建表 ods.sl_account_00000000001 (字段与SQL Server对应,注意前后顺序一致)

    5.4、postgresql 导入 .txt     <--返回目录

      命令:COPY ods.sl_account_00000000001 from 'D:DevToolspgsqlsl_account.txt' with  csv header  delimiter ',' ENCODING 'utf8';

      COPY 命令的使用参考:http://www.postgres.cn/docs/9.3/sql-copy.html(在表和文件之间拷贝数据)

     

    6、中间遇到的问题    <--返回目录

    1)SQL Server 源数据中有空白(比如回车换行)等特殊字符,导致导出的数据换行;

      解决:参考本文标题3

    2)使用 "|" 作为分隔符,发现有一条记录某个字段中间没了分隔符;

      解决:使用 "," 或其他作为分隔符;单独对这条数据进行操作:update dbo.SL_Account set name='刘昕' where id=129929,将原本的空白(也不是回车、换行、制表符、空格,不知道是啥)

    3)导出的 txt 为GBK, 所以需要将txt 转换为 UTF-8;

      解决:参考本文标题4

    4)postgresql 导入 txt,使用 COPY 命令时,需要已经存在的表;

    5)postgresql 导入 txt 时,txt 第一行时字段,此时需要使用 with  csv header

    参考
      1)sql server中查询删除含有回车换行制表符的记录

      2)sqlserver数据库 去除字段中空格,换行符,回车符(使用replace语句)

      3)http://www.postgres.cn/docs/9.3/sql-copy.html(在表和文件之间拷贝数据)

  • 相关阅读:
    C# 日期帮助类【原创】
    C# 发送邮件
    每日一题力扣453
    每日力扣628
    每日一题力扣41巨坑
    每日一题力扣274
    每日一题力扣442有坑
    每日一题力扣495
    每日一题力扣645
    每日一题力扣697
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/13181284.html
Copyright © 2011-2022 走看看