単語検索後に文字を追加する方法

単語検索後に文字を追加する方法

次のフィールド名があります

demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm

以下は私のファイルの例です。最初の列の前に列がありますfck=83

 fck=83;fcv=naismc;fcv=naisjdf;fck=83;fmd=1422811694,;fmd=1422811694;
 fck=83;fcv=demelog;fck=83;fmd=1423134370;
 fck=83;fcv=demelog;fck=83;fmd=1422292546;
 fck=83;fcv=demelog;fck=83;fmd=1421774352;
 fck=83;fcv=decoccm;fck=83;fmd=1422853444;
 fck=83;fcv=voyapro;fck=83;fmd=1422270462;
 fck=83;fcv=voyapro;fcv=demelog;fck=83;fmd=1422183999,;fmd=1422206234,;

ご覧のとおり、fck=83 からline 2fcv=demelog および関連 fmd を取得でき、7 行の場合は fcv=voyapro および fcv=demelog および関連 fmd を1423134370取得できます。fmd=1422183999,fmd=1422206234;

最初の行を覚えていますdemelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccmか?

私の目標は、次の形式を持つことです(たとえば、2行と7行を使用します)。

2号線

 fck=83;fcv=demelog;;;;;;;;;fck=83;fmd=1423134370;;;;;;;;;

7号線

 fck=83;;fcv=voyapro;;;;;;;;;fck=83;;fmd=1422270462;;;;;;;;;

ご覧のように、fcvとfmdのfck = 83に関連する追加の列を追加しました。demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm

Pythonやawkとsedで何をするのかわからない場合でも、awk、sed、またはPythonで実行したいと思います。

demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccmたぶん別のファイルに追加し、インデックスを使って検索することもできます。文字列がここにある場合は何もしません。ここに存在しない場合は、追加の列を追加します。

技術的にどこに行くべきか混乱し、髪を抜き始めると、どんな助けでも歓迎されます。

修正する

Pythonで私の試みは次のとおりです

import re
word_list=    ['fcv=demelog','fcv=voyapro','fcv=naisjdf','fcv=naismc','fcv=decoide','fcv=decoccm','fcv=travide','fcv=travccm','fcv=equiccm','fcv=mariccm']


regex_string = "(?<=\W)(%s)(?=\W)" % ";".join(word_list)

find=re.compile(regex_string)

with open ("idcacf_v5.txt", "r") as myfile:
    data=myfile.read().replace('\n', '')


finder = re.compile(regex_string)
string_to_be_searched = data

results = finder.findall ("%s " % string_to_be_searched)
result_set = set(results)
for word in word_list:
    print ("%s in string" % word)

ご覧のとおり、インデックスを構築するには2つのことが必要です。 2つ目は、fcvで行った操作を順番に複製し、fmd=timestamp同じ順序を行に入れることができることです。

ベストアンサー1

CSVモジュールを使って私がまとめたものは次のとおりです。

#! /usr/bin/env python3

import csv, sys

word_list = ['fcv=demelog','fcv=voyapro','fcv=naisjdf','fcv=naismc','fcv=decoide','fcv=decoccm','fcv=travide','fcv=travccm','fcv=equiccm','fcv=mariccm']

csvin = csv.reader (sys.stdin, delimiter=';')
csvout = csv.writer (sys.stdout, delimiter=';')
for row in csvin:
    word_list_fck = [row[0]] + word_list
    fmd_start = row[1:].index(row[0]) + 1
    row_fcv = row[:fmd_start]  # split fcv from fmd
    row_fmd = row[fmd_start:]
    out_row = [entry if entry in row_fcv else ''  for entry in word_list_fck]
    out_row = out_row + [row_fmd.pop(0) if out_row[i] != '' else '' for i in range(len(word_list_fck))]
    csvout.writerow (out_row)

出力例:

$ python3 test.py < test.txt
fck=83;;;fcv=naisjdf;fcv=naismc;;;;;;;fck=83;;;fmd=1422811694,;fmd=1422811694;;;;;;
fck=83;fcv=demelog;;;;;;;;;;fck=83;fmd=1423134370;;;;;;;;;
fck=83;fcv=demelog;;;;;;;;;;fck=83;fmd=1422292546;;;;;;;;;
fck=83;fcv=demelog;;;;;;;;;;fck=83;fmd=1421774352;;;;;;;;;
fck=83;;;;;;fcv=decoccm;;;;;fck=83;;;;;;fmd=1422853444;;;;
fck=83;;fcv=voyapro;;;;;;;;;fck=83;;fmd=1422270462;;;;;;;;
fck=83;fcv=demelog;fcv=voyapro;;;;;;;;;fck=83;fmd=1422183999,;fmd=1422206234,;;;;;;;;

メモ:

  • 私は行の最初の要素(fck=83例の場合)をsfcvfmdsを区切る項目として使用します。そうでなければ、問題はさらに複雑になります。
  • List Comprehension の繰り返しを考慮すると、if bar in foo各行の長さによっては非常に遅くなることがあります。

についてout_row = [entry if entry in row_fcv else '' for entry in word_list_fck]

  • csv.readerリストに解析するときに、目的の出力がどのように見えるかを検討してください(例:2行目のインポート)。["fck=83" ,"fcv=demelog", "", "", "", "", "", "", "", "", "", "", "fck=83", "fmd=1423134370", "", "", "", "", "", "", "", "", ""]- すべての空の項目は空の文字列になります。
  • 出力には、fcv入力に表示されないすべての空の項目を含める必要があります。
  • したがって、以下をcsv.writer使用して作成するためのリストを作成するときfcvrow_fcvif entry in row_fcv else ''

おすすめ記事