• 締切済み

テキストファイルの変換アルゴリズム

テキストファイル(CSV)を読み込み、変換して別のファイルに保存するスクリプトで悩んでいます。 下記<Source.csv>を<Result.csv>のように変換します。 いわゆるツリー構造のデータで、重複している部分をまとめて総数を付加するというものですが、ちょっと変則的です。 考え方のヒントだけで結構ですので、ご教示いただけませんでしょうか。コードまでは必要ありません。 なお蛇足ですがVBScriptを使用します。 <Source.csv> =============================== L1a,,, ,L2a,, ,,L3a, ,,,L4a ,,L3a, ,,,L4a ,,L3a, ,,,L4a ,L2b,, ,L2b,, ,L2b,, ,L2c,, ,,L3c, ,,L3c, <Result.csv> =============================== L1a,,,,1 ,L2a,,,1 ,,L3a,,3 ,,,L4a,1 ,L2b,,,3 ,L2c,,,1 ,,L3c,,2

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

問題の>ツリー構造のデータで、重複している部分をまとめて総数を付加するというものですがと、余り親切な説明が無く、わかる人さえ答を出してくれれば良いという風に、すげなく感じるが、質問を読む人に少し丁寧に説明してはどうかな。 ーー 質問の例を、エクセルシートのA列に貼り付けエクセルの「区切り位置」の操作で分離すると(下記で-は空白セル。左詰で表現されないように、わざと仮に入れているもの) L1a - L2a - - L3a - - - L4a - - L3a - - - L4a - - L3a - - - L4a - L2b - L2b - L2b - L2c - - L3c - - L3c のようになる。 ーー これだと各列(左からのカンマの数で既定される?)で考えて、かつ、上行から下に考えて、「違う文字列」のリストとその出現数を数えればよいようだが。 ただし説明されてないことで、死命を制しそうな、例えばL2bは上の表の行外にもまた現れる可能性があるのか? 現れないなら、各列で、コントロールブレークのロジックで、L2bなどが続く間は+1して足しこめば良いのかな。コントロールが切れたときに、それまでの合計件数を件数とする。 上記のようなエクセルのシートで展開は難しいかろうから、上記各列で、配列で同列の前のデータを記録しておいて同じ文字列かどうか判断していけば良いのでは ーーー なお Resultのほうは L1a - - - 1 - L2a - - 1 - - L3a - 3 - - - L4a 1 - L2b - - 3 - L2c - - 1 - - L3c - 2 になるが、正しくはL4aの1は、3の間違いでは?

cah15830
質問者

お礼

レスありがとうございます。 正直なところ、解答がつくとは思っていませんでしたので、ちょっとおざなりなきき方になってしまいました。申し訳ないです。 おっしゃるとおり、もとはExcelのデータとして吐き出されたもので、ExcelVBAではどうしようもなくcsvで加工することにした次第です。 例ではL1aが親、L2aが子、L3aが孫、L4aがひ孫という構造ですが、L1a以下のまったく同じかたまりがまた出現することもありますし、L4aが他の親の子ということもあります。 ご指摘のResultですが、L4aはL3aからみると親子関係で、総数はそれぞれの親子関係の掛け算で算出するため、La4=1になるのです。 (La4の総数 = (L1aの数)1×(L3aの数)3×(L4aの数)1 = 3 二次元配列に読み込むところまではよいとして、どのようなロジックでこれを整理すべきか考えあぐねていました。

cah15830
質問者

補足

自己解決しました。二次元配列に入れループをまわします。 1)「親子」列を登録します。現在行の要素(例えば2行目は「L2a」)は、一行目の「L1a」と親子関係にあるので、親子列の値は「L1a-La2」となります。 2)「新規再出」列を登録します。親子列を一行目から順に検索して、初めて現れたときは「0」を、再出のときは初めて現れた行番号を登録します。 3)Lv1~Lv4列を用意します。新規再出列を見て、0ならば現在の行の該当するLvを+1、0以外ならその行番号の該当するLvを+1します。 4)「数量」列を算出します。数量はひとつ上のLvの値で現在のLvの値を割ったものになります。 せめて表が掲載できるとよいのですが、文章だけで表現するのは難しいですね。 回答いただいた方、ありがとうございました。

  • tossy2011
  • ベストアンサー率17% (3/17)
回答No.1

重複チェック処理の対象文字列にタブがないならタブ形式で開く タブも対象文字列ならば一行ずつ読み込んでダブルコーテーションで括ってtmpファイルとして保存してそれを開く その後重複数をカウント

cah15830
質問者

お礼

回答ありがとうございます。 単純に重複数をカウントできないところが難しいところです。

関連するQ&A