3

次の形式のcsvファイルがあります。

CSV FILE
"a"             , "b"     , "c" , "d"
hello, world    , 1       , 2   , 3
1,2,3,4,5,6,7   , 2       , 456 , 87
h,1231232,3     , 3       , 45  , 44

問題は、最初のフィールドにコンマ「、」が含まれていることです。ファイルの生成は、受信する形式であるため、制御できません。CSVファイルを行末から先頭まで逆方向に読み取る方法はありますか?

私が正しい方向に導かれていれば、そうするための小さなpythonスクリプトを書いてもかまいません。

4

8 に答える 8

16

stringメソッドはrsplit、文字列を左ではなく右から分割するため、おそらくそれが探しているものです(分割する最大回数を指定する引数を取ります)。

line = "hello, world    , 1       , 2   , 3"
parts = line.rsplit(",", 3)
print parts  # prints ['hello, world    ', ' 1       ', ' 2   ', ' 3']

分割されたリストの各項目の最初と最後から空白を削除したい場合はstrip、リスト内包表記を使用したメソッドを使用できます。

parts = [s.strip() for s in parts]
print parts  # prints ['hello, world', '1', '2', '3']
于 2009-08-13T14:32:41.007 に答える
4

各行を逆に読みたい理由がよくわかりませんが、次のようにすることができます。

import csv
file = open("mycsvfile.csv")
reversedLines = [line[::-1] for line in file]
file.close()
reader = csv.reader(reversedLines)
for backwardRow in reader:
    lastField = backwardRow[0][::-1]
    secondField = backwardRow[1][::-1]
于 2009-08-13T14:36:26.247 に答える
1

(perl regex)のように、いつでも正規表現で何かを行うことができます

#!/usr/bin/perl

use IO::File;

if (my $file = new IO::File("test.csv"))
{
    foreach my $line (<$file>) {
    $line =~ m/^(.*),(.*?),(.*?),(.*?)$/;
    print "[$1][$2][$3][$4]\n";
    }
} else {
    print "Unable to open test.csv\n";
}

(最初は貪欲な検索で、最後の3つはそうではありません) 編集:正規表現だけでなく完全なコードを投稿しました

于 2009-08-13T14:30:56.360 に答える
1

最初に文字列を反転してから処理します。

tmp = tmp [::-1]

于 2009-08-13T14:31:05.190 に答える
1

提供したサンプルから、「列」は固定サイズのようです。最初(コンマ付き)は16文字の長さなので、ファイルを1行ずつ読み取ってから、各行で最初の16文字(最初の列の値として)を読み取り、残りをそれに応じて読み取ってみませんか?それぞれの値を取得したら、さらに解析します(空白の削除など)。

于 2009-08-13T14:33:15.623 に答える
1

それはCSVファイルではありません。カンマ区切りはそれだけを意味します。

そうでないことをどのように確信できますか?

CSV FILE
"a"             , "b"     , "c" , "d"
hello           , world   , 1   , 2   , 3
1               , 2       , 3   , 4   , 5,6,7,2,456,87
h               , 1231232 , 3   , 3   , 45,44

ファイルが指定どおりの場合、最初のグループは引用符で囲む必要があります。フィールド名が非常に奇妙であるため、コンマを含むフィールドはそうではないように見えます。

私は彼らのソースからエラーを修正するのが好きではありません。彼らが主張しているのであれば、適切なCSVを配信するためにデータジェネレーターにプッシュバックします。

于 2009-08-13T14:35:21.910 に答える
0

常に同じ数の列が必要で、最初の列のみにコンマを含めることができる場合は、何かを読み取って、最初に余分な列を連結します。

問題は、インターフェースがあいまいであり、これを回避することを試みることができるということですが、より良い解決策は、インターフェースを修正しようとすることです(これは多くの場合、複数のパッチを作成するよりも困難です...)。

于 2009-08-13T14:36:01.237 に答える
0

私はビール氏に同意します。これは、不正な形式のcsvファイルです。最善の策は、他の区切り文字を見つけるか、コンマのオーバーロードを停止するか、フィールドを区切っていないコンマを引用符で囲むかエスケープすることです。

于 2009-08-13T14:36:03.563 に答える