bashとawkを使用してCSVファイルを解析する

こんにちは、habretchitel!

あるシステムのインターフェースを翻訳する必要がありました。 各フォームの翻訳は個別のXMLファイルにあり、ファイルはグループ内のフォルダーにグループ化されますが、これは非常に不便です。 Excelのすべてのフォームの翻訳を処理する単一の辞書を作成することにしました。 このタスクは、2つのサブタスクに分かれています。すべてのXMLファイルから情報を単一のCSVファイルに抽出し、CSVファイルから変換した後、以前の構造のXMLファイルを作成します。 ツールとして、bashとawkが選択されました。 最初のサブタスクは非常に簡単なため、説明する意味はありません。 しかし、CSVファイルを解析する方法は?

インターネットでは、このトピックに関する多くの情報を見つけることができます。 ほとんどの例では、簡単なオプションを簡単に処理できます。 しかし、たとえばこれに適したものは見つかりませんでした。

./web/analyst/xml/list.template.xml;test;"t ""test""; est"
./web/analyst/xml/list.template.xml;%1 _{factory_desc}s found. Displaying %2 through %3; : %1. %2 %3


Excelでは、これらの行は次のようになります。
ファイルタグ付け翻訳
./web/analyst/xml/list.template.xmlテストするt "テスト"; est
./web/analyst/xml/list.template.xml%1 _ {factory_desc}が見つかりました。 %2〜%3を表示見つかったオブジェクト:%1。 %2〜%3で表示

OpenNETの例に基づいて、変更することにしました。 awkプログラムのテキストは次のとおりです。

 { $0=$0";"; while($0) { #       ,  ;  ""; match($0,/[^;"]*;|^"[^"]*(""[^"]*)*";/); #     F  SF SF=F=substr($0,RSTART,RLENGTH); #  ;  ""; gsub(/^"|";$|;$/,"",F); #      gsub("\"\"","\"",F); ++c; #    file_to   xml-      if (c%3==1) file_to=AWK_XML_PATH F; #   xml- tag      if (c%3==2) print " <ResourceString>\r\n <tag>"F"</tag>" > file_to; #   xml- value      if (c%3==0) print " <value>"F"</value>\r\n </ResourceString>\r\n" > file_to; #     SF gsub(/\\/,"\\\\",SF); #  .    SF gsub("([][?$|^+*()])","\\\\""&",SF); #       SF   .  sub(SF,""); } } 

XML_PATH 、bashスクリプトのフラグメントを示します( XML_PATHは、XMLファイルのあるフォルダーが配置されているパスを持つ変数です)。

 #         iconv -f WINDOWS-1251 -t UTF8 $1 | tr -d '\r' | sed '1d' > translation.csv # ""     xml- awk -v AWK_XML_PATH="$XML_PATH" –f csv_parse.awk translation.csv 

その結果、テーブルから
ファイルタグ付け翻訳
./web/analyst/xml/list.template.xmlテストするt "テスト"; est
./web/analyst/xml/list.template.xml%1 _ {factory_desc}が見つかりました。 %2〜%3を表示見つかったオブジェクト:%1。 %2〜%3で表示

次の内容のlist.template.xmlファイルが生成されます。

  <ResourceString> <tag>test</tag> <value>t "test"; est</value> </ResourceString> <ResourceString> <tag>%1 _{factory_desc}s found. Displaying %2 through %3</tag> <value> : %1.   %2  %3</value> </ResourceString> 

PS
問題をより効率的に解決できる他のツールを選択できることを知っています。 たぶんPython。 この例は、何らかの理由で使用できない場合に役立ちます。

Source: https://habr.com/ru/post/J184956/


All Articles