在CSV UNIX中删除双引号中的\n

2024-09-30 03:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由IBMs从Z/OS传递更改数据生成的平面文件。数据中有新行或\n。我已经找到了一种方法,用awk命令替换其中的大部分,但似乎有一个小错误。如果有奇数个引号的行以引号结尾,则不会将\n替换为空格。不管是什么原因,我不得不循环两次才能得到大部分。我只剩下一条记录,它仍然具有\n。这是一个样品。在

"2013-11-19 10:09:09","0","I","NOT SET   ","
simple string                            "

基本上需要:

^{pr2}$

以下是我使用的代码:

#For loop#
for a in 1 2 
do
  awk -F'"' '$NF""{printf("%s ", $0);next}1' $1 > $1.filter
  rm -f $1
  mv $1.filter $1
  echo $a
done

这个文件中有大约10万条记录。它被datastage接收,但是看到\n抛出该记录,因为它认为下一行应该是一个新记录。在

谢谢, 乔希

编辑:

我发现了这个Perl命令,它可以做任何事情,但最后还是出现了与上面一样的错误。在

$ perl -p -le 's/\n+/ /g'


Tags: 文件数据方法命令os错误结尾记录
3条回答

我研究了glennjackman的建议,并在python中找到了一个解决方案。下面是我使用Python编写的代码:

#!/usr/bin/python

import sys, csv, os

inputfile=sys.argv[1]
outputfile=sys.argv[1] + '.filter'
newtext=' '

print inputfile
print outputfile

with open(inputfile, "rb") as input:
  with open(outputfile, "wb") as output:
    w = csv.writer(output, delimiter=',', quotechar='"', quoting=csv.QUOTE_NONNUMERIC, lineterminator='\n')
    for record in csv.reader(input):
      w.writerow(tuple(s.replace("\n", newtext) for s in record))

os.rename(outputfile, inputfile)

谢谢大家的帮助。希望有同样问题的人会发现这个。这个解决方案唯一的问题是它在所有字段(包括空字段)周围添加引号。在

谢谢,乔希

编辑:

我能够使用perl快速删除彼此旁边的所有双引号。在

perl -pi -le 's/""//g' data

我会使用带有CVS解析器的语言。尝试解析当前行,如果有错误,请连接下一行并重试:例如,使用ruby:

ruby -rcsv -ne '
  chomp
  loop do
    begin
      row=CSV.parse_line($_)
      # if no error thrown, we have a parseable line
      puts row.inspect
      break
    rescue
      # grab the next line and try again
      $_ += gets
    end
  end
' << END
a,b,c,d,e
1,2,3,4,5
"2013-11-19 10:09:09","0","I","NOT SET   ","
simple string                            "
"a 1","b 2","c 3","d 4","e 5"
END
^{pr2}$

有一种方法:

sed -n -e ':b; /^[^"]*"[^"]*\("[^"]*"[^"]*\)*$/ { N; s/\
//; bb; }; p; '

在伪代码中

^{pr2}$

输出示例:

$ cat file
"2013-11-19 10:09:09","0","I","NOT SET   ","
simple string                    "
"normal data",42
"some other
string"
$ sed -n -e ':b; /^[^"]*"[^"]*\("[^"]*"[^"]*\)*$/ { N; s/\
//; bb; }; p; ' < file
"2013-11-19 10:09:09","0","I","NOT SET   ","simple string                  "
"normal data",42
"some otherstring"
$ 

注意,任何用反斜杠转义的引号都会破坏它("foo\"bar"),而用引号转义的引号("foo""bar")则可以。确保你知道你使用的CSV方言。在

相关问题 更多 >

    热门问题