teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

補足

2019/03/01 04:43

投稿

KojiDoi
KojiDoi

スコア13727

answer CHANGED
@@ -41,4 +41,12 @@
41
41
  }
42
42
  }
43
43
  }
44
- ```
44
+ ```
45
+
46
+ 追記: 上記サイトから引用します。
47
+ > このパターンでは、CSVファイルの規格にある「ダブルクォートで括られた中に改行を含めることが可能」というルールに対応することはできません。
48
+ このような中途半端な状態なのにCSVファイルを扱えると明言するのはおかしいのではないかという意見もありますが、gawkの開発は「完全を目指すのではなく9割をサクサクこなし、フィールドに改行を含むようなCSVファイルは専用のツールで処理すれば良い」という思想で進められました。
49
+
50
+ ようするに、いつでも使えるわけではないが、使えるときには使って簡単に片づけたらいいじゃんという発想です。awkとはそういうものです。awkが本件ではうまく使えない可能性はあるし、もっといい方法がある可能性もあります。
51
+
52
+ 私はこれを唯一絶対最高の解決策だと主張したいわけではありません。しかし、条件が合うなら最短距離で問題を片づけられる可能性はあると考えています。何かごちゃごちゃ言っている人がいますが、まどわされず、ご自分の案件に使えるかどうかは質問者さんご自身が淡々と判断していただければと思います。

3

新しいawkが見つかりました。これで彼氏の言っていた問題は完全に解決できます。

2019/03/01 04:43

投稿

KojiDoi
KojiDoi

スコア13727

answer CHANGED
@@ -19,4 +19,26 @@
19
19
  とコマンドを入力すると値の不一致なデータとその行・列番号が出力されるはずです。
20
20
  入力元ファイルはCSVファイルにコンバートしてあるものとこのコードは仮定していますが、本来はtab区切りデータを推奨したいところです。
21
21
 
22
- やってみないと分かりませんが、たぶんvbaよりは速く結果が返ってくるんじゃないかなと思います。慣れればVBAなんてバカバカしくて使ってられなくなる…はず。
22
+ やってみないと分かりませんが、たぶんvbaよりは速く結果が返ってくるんじゃないかなと思います。慣れればVBAなんてバカバカしくて使ってられなくなる…はず。
23
+
24
+ # gnu awk4 on windows
25
+
26
+ さらに調べてみたところ、[https://www.klabaster.com/freeware.htm](https://www.klabaster.com/freeware.htm)で、gawk4.0のwindows版実行ファイルが配布されています。
27
+ gawk4.0にはFPATという組み込み変数が追加されており、「値の中に,が含まれるcsvを扱おうとすると困ってしまう」問題を実質的に解決できるようになっています。
28
+ 参考:[GNU AWKでCSVファイルを楽々あつかう組込変数FPATと、関数のインダイレクト呼び出し](https://codezine.jp/article/detail/8323)
29
+
30
+ ダウンロードしてexeファイルをpathの通ったところに置くだけですので、導入の簡単さではbusyboxと変わらず、機能面を考えるとこちらが良いでしょう。
31
+
32
+ これを利用して上記スクリプトを書き換えたものを示しておきます。
33
+
34
+ ```
35
+ BEGIN{FPAT="([^,]+)|(\"[^\"]+\")"; n=100}
36
+ {
37
+ for(i=1; i<=n; i++){
38
+ x=$i; y=$(i+n);
39
+ if(x!=y){
40
+ printf "line %d: col %d = '%s'; col %d = '%s'\n", NR, i, x, i+n, y;
41
+ }
42
+ }
43
+ }
44
+ ```

2

補足・修正2

2019/02/28 20:22

投稿

KojiDoi
KojiDoi

スコア13727

answer CHANGED
@@ -17,6 +17,6 @@
17
17
 
18
18
  上記に従えば`awk -f test.awk 対象ファイル`
19
19
  とコマンドを入力すると値の不一致なデータとその行・列番号が出力されるはずです。
20
- 入力元ファイルはCSVファイルにコンバートしてあるものと仮定しています。
20
+ 入力元ファイルはCSVファイルにコンバートしてあるものとこのコードは仮定していますが、本来はtab区切りデータを推奨したいところです
21
21
 
22
22
  やってみないと分かりませんが、たぶんvbaよりは速く結果が返ってくるんじゃないかなと思います。慣れればVBAなんてバカバカしくて使ってられなくなる…はず。

1

補足・修正

2019/02/27 12:09

投稿

KojiDoi
KojiDoi

スコア13727

answer CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  次に以下のような感じのスクリプトをテキストエディタで書いてたとえばtest.awkというテキストファイルにセーブします。
6
6
  ```
7
- BEGIN{n=100}
7
+ BEGIN{FS=","; n=100}
8
8
  {
9
9
  for(i=1; i<=n; i++){
10
10
  x=$i; y=$(i+n);
@@ -17,5 +17,6 @@
17
17
 
18
18
  上記に従えば`awk -f test.awk 対象ファイル`
19
19
  とコマンドを入力すると値の不一致なデータとその行・列番号が出力されるはずです。
20
+ 入力元ファイルはCSVファイルにコンバートしてあるものと仮定しています。
20
21
 
21
22
  やってみないと分かりませんが、たぶんvbaよりは速く結果が返ってくるんじゃないかなと思います。慣れればVBAなんてバカバカしくて使ってられなくなる…はず。