質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

1回答

2231閲覧

while文にiconvの結果を流し込むと処理が必ず飛び飛びになる

yumetodo

総合スコア5850

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2017/01/14 09:57

sh

1#!/bin/bash 2# @param input_file input file name 3# @param prefix C-Preprocesser-Macro-Function name 4# @param need_double_quote_index... 5function convert_csv(){ 6 # argument 7 readonly input_file=$1 8 readonly prefix=$2 9 shift 2 10 local need_double_quote_index=($@) 11 12 readonly need_double_quote_index_len=${#need_double_quote_index[@]} 13 #write BOM 14 echo -en '\xef\xbb\xbf' 15 local line_string 16 local is_first_line=1 17 while read -r line_string; do 18 if (( 1==is_first_line )); then 19 is_first_line=0 20 echo "//PREFIX,${line_string:0:-1},POSTFIX" 21 else 22 IFS_BACKUP=$IFS 23 IFS=',' 24 elements=($line_string) 25 IFS=$IFS_BACKUP 26 local re="${prefix}(," 27 local i=0 28 local j=0 29 local e 30 local tmp 31 # debug print 32 echo "${line_string}" >&2 33 for e in "${elements[@]}"; do 34 if (( i < need_double_quote_index_len && j == need_double_quote_index[i] )); then 35 # ダブルクオートで囲う必要がある時 36 re="${re}\"${e}\"," 37 (( i++ )) 38 else 39 read -p "Press [Enter] key to start backup..." 40 tmp=$(echo "${e}" | sed -e 's/\//./') 41 re="${re}${tmp}," 42 fi 43 (( j++ )) 44 done 45 echo "${re:0:-1},)" 46 fi 47 done < <(iconv -f cp932 -t UTF-8 "${input_file}") 48} 49echo "converting csv..." 50# convert_csv './ships.csv' 'SHIP' 1 > 'KCS_CUI/source/ships_test.csv' 51convert_csv './slotitems.csv' 'WEAPON' 1 2 > 'KCS_CUI/source/slotitems_test.csv' 52echo "done."

こういうコードを書いたのですが
https://github.com/YSRKEN/KanColleSimulator_KAI/blob/2fae104567b8c26029fbf46c49a178f05dd445c1/csv_convert.sh

実行結果が必ず

$./csv_convert.sh converting csv... 1,12cm単装砲,主砲,0,1,0,0,1,0,0,0,0,1 13,61cm三連装魚雷,魚雷,0,0,5,0,0,0,0,0,0,1 25,零式水上偵察機,水上偵察機,0,0,0,1,1,2,1,0,5,0 37,7.7mm機銃,対空機銃,0,0,0,0,2,0,0,1,0,0 49,25mm単装機銃,対空機銃,0,0,0,0,4,0,0,1,0,0 61,二式艦上偵察機,艦上偵察機,0,0,0,0,1,0,3,0,7,0 73,増設バルジ(大型艦),追加装甲(大型),9,0,0,0,0,0,0,-3,0,0 85,3.7cm FlaK M42,対空機銃,0,1,0,0,8,0,1,0,0,0 97,九九式艦爆(熟練),艦上爆撃機,0,0,0,7,1,4,2,0,2,0 109,零戦52型丙(六〇一空),艦上戦闘機,0,0,0,0,9,0,1,1,0,0 121,94式高射装置,高射装置,0,0,0,0,3,0,0,1,0,0 133,381mm/50 三連装砲,主砲,0,20,0,0,2,0,-3,-1,0,4 145,戦闘糧食,戦闘糧食,0,0,0,0,0,0,0,0,0,0 157,零式艦戦53型(岩本隊),艦上戦闘機,0,0,0,0,12,0,2,4,3,0 169,一式陸攻,陸上攻撃機,0,0,10,12,2,2,0,0,3,0 181,零式艦戦32型,艦上戦闘機,0,0,0,0,5,0,0,2,0,0 501,5inch単装砲,主砲,0,1,0,0,0,0,0,0,0,1 513,21inch魚雷前期型,魚雷,0,0,2,0,0,0,0,0,0,1 525,深海棲艦偵察機,水上偵察機,0,0,0,1,1,1,0,0,5,0 537,12.7mm機銃,対空機銃,0,0,0,0,2,0,0,0,0,0 549,深海復讐艦攻,艦上攻撃機,0,0,13,0,4,5,2,0,5,0 561,深海解放陸爆,艦上爆撃機,0,0,0,11,3,5,1,0,3,0 done.

のようにとびとびになります。csv自体は

装備ID,装備名,種別,装甲,火力,雷撃,爆装,対空,対潜,命中,回避,索敵,射程 1,12cm単装砲,主砲,0,1,0,0,1,0,0,0,0,1 2,12.7cm連装砲,主砲,0,2,0,0,2,0,0,0,0,1 3,10cm連装高角砲,主砲,0,2,0,0,7,0,0,0,0,1 . . . 190,38.1cm Mk.I連装砲,主砲,0,18,0,0,1,0,1,0,0,3 191,QF 2ポンド8連装ポンポン砲,対空機銃,0,1,0,0,10,0,0,0,0,0 192,38.1cm Mk.I/N連装砲改,主砲,0,19,0,0,3,0,2,0,0,3 501,5inch単装砲,主砲,0,1,0,0,0,0,0,0,0,1 502,5inch連装砲,主砲,0,2,0,0,0,0,0,0,0,1 503,3inch単装高角砲,主砲,0,1,0,0,1,0,0,0,0,1 . . . 568,16inch三連装砲,主砲,0,24,0,0,3,0,4,0,0,3 569,深海偵察飛行艇,水上偵察機,0,3,0,0,1,2,8,0,9,0 570,高速深海魚雷 mod.2,魚雷,0,0,13,0,0,0,3,0,0,1

のようになっています。
https://github.com/YSRKEN/KanColleSimulator_KAI/blob/2fae104567b8c26029fbf46c49a178f05dd445c1/slotitems.csv

期待する動作としては、while文でcsv一行ずつ処理をしたいのですが、何が問題なのでしょうか?

また、WindowsのMSYS2で実行するとLinuxで実行したときより遥かに多く時間がかかるので、おそらくWindowsにfork()がないためだとは思うのですが、コード中のどの辺が重くなっている要因でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

何をするスクリプトかよくわからないですが、readwhile readの所と、read -p "Press [Enter] key to start backup..."の所と、2カ所かあるのでそれぞれデータを読み込んでいるのでは?
キー入力したいなら、</dev/ttyとか付けてください。

投稿2017/01/14 10:33

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2017/01/14 10:36

あ・・・。本当だ。ありがとうございます。 重くなる原因についてはなにか気がついた点などありますでしょうか?
otn

2017/01/14 10:49

時間が掛かるが正常終了するのでしょうか?
yumetodo

2017/01/14 11:38

Linuxで1分以内なのに30分近くかかりましたが。
otn

2017/01/14 12:30

とりあえず、bash -x でどこで時間が掛かっているのかみるのでしょうか。
yumetodo

2017/01/14 15:49

わかりました。 tmp=$(echo "${e}" | sed -e 's/\//./') のようにしていた部分ですが、外部コマンド呼び出しが重かったようです。 ${elements[$j]//\//.} のように変数展開で書き直すことで劇的に高速化できました! デバッグ機能便利ですね・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問