2014-07-11 52 views
1

CSV输入文件:删除空格其间字段

"18","Agent","To identify^M 
","b5b553d2-81ab-4ec3-83e0-71ae3cf4afab","1"^M 
"1078","Repeat","Identify 
it has","0164f3eb-beeb-47dd-b9b9-9b762f430e14","1"^M 
"621","Com Dot Com","Identify 

","7fc9e73e-3470-4b31-8524-fcb97a4dadee","1"^M 

在上述输入文件,我有3个不同类型的记录。

1)记录没有18(前2行),即使它应该是一行,它作为2行。^M被错误地放置在第一行的末尾。

期望输出(^ M从第一行中删除,并使其一行)

"18","Agent","To identify","b5b553d2-81ab-4ec3-83e0-71ae3cf4afab","1"^M 

2)备案号1078(行无3 & 4) - 在此我不具有^ M在的端第3行。我想将第3行& 4合并为一行。

期望输出

"1078","Repeat","Identify it has ","0164f3eb-beeb-47dd-b9b99b762f430e14","1"^M 

3)备案号621(4号线,5 & 6) - 这具有^ M仅在该行的末尾,但它有一个空行其间。我想删除空白行,并使其成为一条线。

预期输出

"621","Com Dot Com","Identify","7fc9e73e-3470-4b31 8524fcb97a4dadee","1"^M 
+0

请使用[格式工具](http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)来清晰地设置您的问题的格式。 –

+0

好的..谢谢..请问未来的帖子.. – user3072054

+0

我整理了格式为您,但你不认为你可以用较少的字段和较少的字段中的文本显示你的问题。这对任何考虑帮助必须尝试阅读所有这些以找出问题出在哪里的人来说都是非常不利的。这至少阻止我考虑它。 –

回答

0

这可能会实现:

awk -F \",\" ' 
    /^[[:space:]]*$/ { next } 
    { 
    line = line $0 
    if (split(line, a) == 10) { 
     print line 
     line = "" 
    } 
    } 
' file 

我有一种感觉,仍然会出现一些问题(如缺少空格)。

+0

试过了,但是这只打印出第二行.. – user3072054

+0

@ user3072054再试一次。我已编辑它,现在它可以工作。 – ooga

+0

谢谢ooga ..它意外地出现了,所有3条记录都有“,作为第二行的开始,但它也可能有其他的字符,我修改了没有记录的1078.对于混淆对不起。 – user3072054

1

使用Ruby:

ruby -e 'require "csv"; CSV.parse(File.read(ARGV.shift)).each{ |e| e.map!{ |f| f.strip.gsub(/[[:space:]]+/, " ") }; puts CSV.generate_line(e, {:force_quotes => true}); }' csv_file 

输出:

"18","Agent","To identify","b5b553d2-81ab-4ec3-83e0-71ae3cf4afab","1" 
"1078","Repeat","Identify it has","0164f3eb-beeb-47dd-b9b9-9b762f430e14","1" 
"621","Com Dot Com","Identify","7fc9e73e-3470-4b31-8524-fcb97a4dadee","1" 

一点更可读的形式:

ruby -e 'require "csv" 
    CSV.parse(File.read(ARGV.shift)).each{ |e| 
     e.map!{ |f| 
      f.strip.gsub(/[[:space:]]+/, " ") 
     } 
     puts CSV.generate_line(e, {:force_quotes => true}) 
    }' csv_file 
  • bash的历史扩展可能会影响到命令,所以才可以禁用它,如果你想要:shopt -u -o histexpand

脚本版本:

#!/usr/bin/env ruby 
require 'csv' 
CSV.parse(File.read(ARGV.shift)).each{ |e| 
    e.map!{ |f| 
    f.strip.gsub(/[[:space:]]+/, " ") 
    } 
    puts CSV.generate_line(e, {:force_quotes => true}) 
} 

运行与

ruby script.rb csv_file 

Ruby-Doc.org的一切。

+0

+1我的想法确切! –

+1

非常感谢您的帮助 – user3072054

0

使用GNU AWK多焦RS:

$ awk -v RS='^$' -v ORS= 'BEGIN{FS=OFS="\""} {for (i=2;i<=NF;i+=2) gsub(/\n/,"",$i) }1' file 
"18","Agent","To identify^M","b5b553d2-81ab-4ec3-83e0-71ae3cf4afab","1"^M 
"1078","Repeat","Identifyit has","0164f3eb-beeb-47dd-b9b9-9b762f430e14","1"^M 
"621","Com Dot Com","Identify","7fc9e73e-3470-4b31-8524-fcb97a4dadee","1"^M 

因为它是不明确的,如果你真的有控制-MS或没有,我把它们作为字符“^ M”现在。如果你有他们只是gsub()他们。

+1

非常感谢您的帮助! – user3072054