Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除CSV UNIX中双引号之间的\n_Python_Perl_Shell_Unix_Aix - Fatal编程技术网

Python 删除CSV UNIX中双引号之间的\n

Python 删除CSV UNIX中双引号之间的\n,python,perl,shell,unix,aix,Python,Perl,Shell,Unix,Aix,我有一个由IBMs从Z/OS发送更改数据生成的平面文件。数据中有新行或\n。我已经找到了一种方法来使用awk命令替换它们中的大多数,但似乎有一个小错误。如果它是以引号结尾的奇数引号行,则不会用空格替换\n。不管出于什么原因,我必须循环两次才能得到大部分。我只剩下一条记录仍然有\n。这是一个样本 "2013-11-19 10:09:09","0","I","NOT SET "," simple string " 基本上需要: "2013-

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

"2013-11-19 10:09:09","0","I","NOT SET   ","
simple string                            "
基本上需要:

"2013-11-19 10:09:09","0","I","NOT SET   ","simple string                            "
以下是我正在使用的代码:

#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的//\n+//g'

这里有一种方法:

sed -n -e ':b; /^[^"]*"[^"]*\("[^"]*"[^"]*\)*$/ { N; s/\
//; bb; }; p; '
在伪代码中,它是这样的

label foo:
  if we have an odd number of quotes:
    read and append the next line
    remove the line feed
    goto foo

print line
示例输出:

$ 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"
$ 
$cat文件
“2013-11-19 10:09:09”、“0”、“I”、“未设置”
简单字符串“
“正常数据”,42
“别的什么
“字符串”
$sed-n-e:b/^[^”]*“[^”]*\(“[^”]*“[^”]*\)*$/{N;s/\
//;bb;};p;'
请注意,任何用反斜杠转义的引号都将破坏它(
“foo\”bar“
),而用引号转义的引号(
“foo”“bar”
)将起作用。确保您知道您正在使用的CSV方言

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

在之前使用“翻译\”。这将使用更多的cpu,但传递转义“

我将使用带有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

我研究了glenn jackman的建议,并用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的///g”数据

只是好奇:为什么你使用
$NF”“
,而不仅仅是
$NF
?我不确定是否诚实。这两种方法的结果都是一样的。谢谢你的回答。我在尝试使用上述代码时遇到了一个错误。
sed:0602-417标签:b;//^[^***.[^]*.[^*.\(“[^”]*.[^*.*.*.*$/{N;s/\/;bb;};p;大于8个字符。
是否有关于python的示例?此AIX框没有ruby。感谢您的建议,我已经用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)