0

まず、私は Python の完全な初心者であり、Web 言語以外のプログラミングをしています。

そこで、Spendmap と呼ばれるソフトウェアと Freeagent と呼ばれるオンライン アプリとの間のインターフェイスとして Python を使用するスクリプトを開発しました。このスクリプトは完全に機能します。テキスト ファイルをインポートして解析し、API を介して Web アプリにプッシュします。

私が苦労しているのは、Spendmap が注文ごとに複数の行をエクスポートすることですが、Freeagent では注文ごとに 1 行が必要です。そのため、複数の明細にまたがる注文のコスト値を追加し、明細を 1 つに「フラット化」して、API 経由で送信できるようにする必要があります。「キー」フィールドは「PO」フィールドです。そのため、スクリプトで一致する PO 番号が見つかった場合は、上記のようにそれらを平坦化する必要があります。

これは、Spendmap によって生成されるテキスト ファイルの「ダミー」の例です。

5090071648,2013-06-05,2013-09-05, P000001 ,1133997, 223.010 ,20,2013-09-10,104,xxxxxx,AP コメント,002091

301067、2013-09-06、2013-09-11、P000002、1133919、42.000、20、2013-10-31、103、xxxxxx、AP コメント、002143

301067、2013-09-06、2013-09-11、P000002、1133919、359.400、20、2013-10-31、103、xxxxxx、AP コメント、002143

301067、2013-09-06、2013-09-11、P000003、1133910、23.690、20、2013-10-31、103、xxxxxx、AP コメント、002143

上記は読みやすいように書式設定されており、通常は次の行に続く 1 行で、テキストの書式設定はありません。

「キー」または PO フィールドは最初の太字の項目で、2 番目の太字/斜体の項目は合計されるコストです。したがって、この例がスクリプト ID を介して渡される場合、最初の行はそのままにしておく必要があります。2 番目と 3 番目の行のコストは、両方とも同じ PO 番号からのものであり、4 番目の行をそのままにしておくため追加されます。

期待される結果:

5090071648,2013-06-05,2013-09-05, P000001 ,1133997, 223.010 ,20,2013-09-10,104,xxxxxx,AP コメント,002091

301067、2013-09-06、2013-09-11、P000002、1133919、401.400、20、2013-10-31、103、xxxxxx、AP コメント、002143

301067、2013-09-06、2013-09-11、P000003、1133910、23.690、20、2013-10-31、103、xxxxxx、AP コメント、002143

これに関するヘルプは大歓迎です。さらに詳細が必要な場合は、ただ言ってください。

ご覧いただきありがとうございます。

4

2 に答える 2

2

解決策は教えません。ただし、次のことを行う必要があります。

  1. 行を部分に分割する正規表現を作成してテストするか、CSV ライブラリを使用します。
  2. 数値を解析して、文字列ではなく 10 進数にする
  3. IDごとにラインナップを集めます。おそらく、ID を注文のリストにマップする dict を使用できますか?
  4. すべての入力が終了したら、その辞書を反復処理し、そのリストに格納されているすべての注文を合計します。
  5. 行を期待される形式で出力する文字列形式関数を作成します。
  6. おそらく、出力を入力に戻して、同じ結果が得られることをテストします。問題を理解していれば、2回目は変更はないはずです。

幸運を!

于 2013-09-25T11:05:12.440 に答える
0

辞書を使用して行をコンパイルし、get(key,0.0)値が既に存在する場合は合計するか、存在しない場合はゼロから始めます。

InputData = """5090071648,2013-06-05,2013-09-05,P000001,1133997,223.010,20,2013-09-10,104,xxxxxx,AP COMMENT,002091
301067,2013-09-06,2013-09-11,P000002,1133919,42.000,20,2013-10-31,103,xxxxxx,AP COMMENT,002143
301067,2013-09-06,2013-09-11,P000002,1133919,359.400,20,2013-10-31,103,xxxxxx,AP COMMENT,002143
301067,2013-09-06,2013-09-11,P000003,1133910,23.690,20,2013-10-31,103,xxxxxx,AP COMMENT,002143"""

OutD = {}
ValueD = {}

for Line in InputData.split('\n'):
    # commas in comments won't matter because we are joining after anyway
    Fields = Line.split(',') 
    PO = Fields[3]
    Value = float(Fields[5])
    # set up the output string with a placeholder for .format()
    OutD[PO] = ",".join(Fields[:5] + ["{0:.3f}"] + Fields[6:])
    # add the value to the old value or to zero if it is not found
    ValueD[PO] = ValueD.get(PO,0.0) + Value

# the output is unsorted by default, but you could sort or preserve original order
for POKey in ValueD:
    print OutD[POKey].format(ValueD[POKey])

PSはい、大文字がクラス用であることは知っていますが、これにより、定義した変数を簡単に知ることができます...

于 2013-09-25T18:00:17.927 に答える