sql - 字段值内的分隔符 SQL Server

标签 sql sql-server csv delimiter

我有一个超过 2000 万行的 csv 文件,分隔符是竖线。问题是文件中有一个文本列,其中文本中还包含竖线,这会弄乱数据并导致在 SQL Server 中导入 csv 文件时该列移动到下一列。

文件太大而无法处理,例如如果我们想使用精美的文本编辑器添加限定符或更改分隔符类型。

有什么想法吗?理想情况下,像这样的问题有什么通用的解决方案吗?有时,尽管您使用限定符,但可能存在包含类似限定符的字符串、分隔符等的文本字段。

这些字段不带引号。这些行看起来就像这样:

field1|field2|field3|field4  
1|000|some text|some text  
2|001|some text con|taining pipe|some text  
3|002|some text|some text  

最佳答案

可以访问 bash(Linux/Unix/Cygwin 等)


为了估计问题的严重性,请检查具有 4 个字段和其他数量字段的记录数。

awk -F'|' '{rec[NF==4?"NF=4":"NF!=4"]++}END{for(nf in rec){print nf,rec[nf]}}' MyFile.csv

生成一个包含良好记录的文件并加载它。

awk -F'|' 'NF==4{print}' MyFile.csv > MyFile_good.csv

生成一个包含不良记录的文件,并检查是否可以手动或其他方式修复它(如果您识别出模式)

awk -F'|' 'NF!=4{print}' MyFile.csv > MyFile_bad.csv

支持限定符

"1"|"000"|"some text"|"some text"  
"2"|"001"|"some text con|taining pipe"|"some text"  
"3"|"002"|"some text"|"some text"  

我们现在不再定义分隔符 (awk -F'|'),而是定义限定字段 (FPAT="\"[^\"]*\"“)

awk 'BEGIN{OFS="\t";FPAT="\"[^\"]*\""}{rec[NF==4?"NF=4":"NF!=4"]++}END{for(nf in rec){print nf,rec[nf]}}' MyFile.csv

关于sql - 字段值内的分隔符 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40737210/

相关文章:

mysql - where 子句中的别名

mysql - 检查两个表中两行中是否存在数据

sql-server - 无法在 Linux 上的 SQL Server 2017 Express 上启用 xp_cmdshell

sql-server - SQL Server 中单个语句的读提交隔离级别

mysql - 我无法弄清楚这个查询

mysql - 使用 phpMyAdmin 将带有部分数据的制表符分隔的 csv 文件导入到 mysql 表中

php - 优化查询: get all votes from user's item

sql - Transact-SQL - 子查询还是左连接?

java - 输入到csv文件中的包含逗号的字符串

python - 错误: 'list' object has no attribute 'lower'