【问题标题】:Line breaking issue to move csv file in Linux在 Linux 中移动 csv 文件的换行问题
【发布时间】:2016-08-31 23:52:09
【问题描述】:

[我已将 csv 文件以二进制模式移动到 Linux 系统中。一个字段的文件内容被吐到多行它的注释部分,我需要删除新行,保持相同的格式,请帮助shell命令或perl命令

这里是三个记录的例子,实际看起来像] Original content of the file

[移入linux后,cmets字段被分成4行,我想保持注释字段格式不变,但不想要换行符

"第一行

第二行

第三行 所有行格式都不应改变” ]2

【问题讨论】:

  • 行号呢?每条记录后还有空行吗?
  • 是否要删除第二列中的所有行新行?
  • 嗨sjsam,实际上行号不是必需的,保持空白行不变。打算使用sql loader将该字段加载到oracle表中,考虑两个字段和三个记录存在
  • 我用 , 作为 csv 的分隔符
  • 是的 Ruslan,不要合并行,保持空白行原样

标签: regex linux perl shell sql-loader


【解决方案1】:

正如我在上面的评论中所说,规格尚不清楚,但我怀疑这是您想要做的。这是一种使用sqlldr 将数据加载到Oracle 中的方法,其中字段用双引号括起来并包含换行符,其中记录的结尾是回车符/换行符的组合。例如,当数据来自保存为 .csv 的 Excel 电子表格时,可能会发生这种情况,其中单元格包含换行符。

这是由 Excel 导出为 .csv 并在 gvim 中查看的数据文件,并打开了显示控制字符的选项。您可以看到换行符为'$' 字符,回车符为'^M' 字符:

100,test1,"1line1$
1line2$
1line3"^M$
200,test2,"2line1$
2line2$
2line3"^M$

使用infile 选项行上的"str" 子句来构造这样的控制文件以设置记录结束字符。它告诉 sqlldr 十六进制 0D(回车或 ^M)是记录分隔符(这样它将忽略双引号内的换行符):

LOAD DATA
infile "test.dat" "str x'0D'" 
TRUNCATE
INTO TABLE test
replace
fields terminated by ","  
optionally enclosed by '"'
(
cola char,
colb char,
colc char
)

加载后,数据看起来像这样,注释字段中保留了换行符(我称之为 colc):

SQL> select *
  2  from test;

COLA                 COLB                 COLC
-------------------- -------------------- --------------------
100                  test1                1line1
                                          1line2
                                          1line3

200                  test2                2line1
                                          2line2
                                          2line3

SQL>

【讨论】:

  • 嗨,Gary,它的效果非常好,这是我所期望的,非常感谢:)
  • 太好了,很高兴听到它有帮助。
猜你喜欢
  • 2020-12-28
  • 2018-03-06
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
相关资源
最近更新 更多