#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* cucv: cutcsv アクセステキストのフィールド切り出し */
/* 第8段階 cucv8.c 20180511
最後の改行いらないが、取り合えず何とか、linuxはでないことに気づく
第2項から切り出しの時の先頭のコンマもいらないが、なんとなくこのまま
しかし難関”、”処理に挑戦 何とか
7.バイナリの時もエラーになるようにした、本処理の中
8.オプション引き取りにしたい、先頭が'-'で始まる引数をモード指定にする
-u オプションでダブルコーテーション内のコンマをアンダーバーにする
これはcatの引数処理の場合難しそうだ、オプション指定はモード指定として取り出し、
あとのargvを前に詰めるそのうえでエラーチェックにする
*/
/* K&R のCAT第2版を流用
引数を入力ファイル名、切り出しフィールドの文字列にする
副関数はいらない 構造をシンプルに
*/
int main(int argc, char *argv[])
{
FILE *fp;
char *prog = argv[0]; /* プログラム名。エラー表示で使う */
int c,n,hl;
int fldno = 1; /*フィールド番号 */
int dqflag = 0; /*ダブルコーテーション内のコンマ処理のためのフラグ boolでよいかも*/
int hikino; /* 引数番号比較*/
char h; /* 引き数の文字 */
int mode = 0;
/*アンダーバー出力のためのモード、boolでよいかも、
とりあえずオプション増えるときのためint
*/
/*エラー処理 引き数チェックなど*/
if (argc == 1 || argc ==2){ /* 引数なし又はファイル名のみの場合:簡単な使い方 */
fprintf(stderr
, "%s:アクセステキストのフィールド切り出し\n", prog
); }
if ((fp
= fopen(argv
[1], "r")) == NULL
){ /* ファイルオープンは第一引数のみにする*/ fprintf(stderr
, "%s:ファイルオープン失敗 %s\n", prog
, argv
[1]); }
for (hikino = 2; hikino < argc; hikino++){
/*第2引数以降が'-'&'u'の時
'u'じゃない時エラー、'u'の時
モード設定し、argvを前に詰める
error かえれない
*/
h = argv[hikino][0];
if ( h == '-'){
h = argv[hikino][1];
if( h== 'u'){
mode = 1;
for (n
= hikino
; n
< argc
; n
++) strcpy (argv
[n
], argv
[n
+1]); argc --;
}
else{
fprintf(stderr
,"%s:オプションは-uだけ \n", prog
); }
}
}
for (hikino = 2; hikino < argc; hikino++){
/*第2引数以降が自然数でない時
最大255くらいだから 文字列の各桁がASCI数値であることを確かめる
引数の長さ3文字以下、各文字が数であること、
argv を 2次元配列としてアクセス こっちが難関だった
*/
if ( hl > 3){
fprintf(stderr
,"%s:フィールド指定は整数3桁まで\n", prog
); }
for ( n = 0 ; n < hl ; n++){
h = argv[hikino][n];
if (h < '0' || h > '9'){
fprintf(stderr
,"%s:フィールド指定は整数\n", prog
); }
}
}
/*本処理*/
while((c
= getc(fp
)) != EOF
){ /*xlsなんかの時もエラー処理
ここ以外に場所がない気がするが、
構造的に分かりにくくなった気がする
いっそ先に全部読みたくなる
*/
if (c <= 8 ){
fprintf(stderr
,"%s:おそらくバイナリファイルです。%sを閉じ終了します\n",prog
,argv
[1]); }
/*ダブルコーテーションの処理 2個までコンマを数えないこと */
if (c == '"' ) ++dqflag;
if (c == ',') {
if( dqflag == 0) ++fldno;
else if( dqflag == 2) {
++fldno;
dqflag = 0;
}
}
/*あとは全部の残った引数文字列の数値とfldnoが同じ時だけ出力する、でよいはず
1 フィールド数のカウント、変数fldnno 1で初期化か
2 第3以降の引数との比較
3 合致してたら出力
4 そのうえで改行かどうかチェック、改行の時、fldnoを更新し、改行を出力する
*/
for (hikino = 2; hikino < argc; hikino++)
if (fldno
== atoi(argv
[hikino
])){ if ( c
== ',' && dqflag
== 1 && mode
== 1) putc('_', stdout
); }
if (c == '\n') {
fldno = 1;
}
}
fprintf(stderr
, "%s: 書き出し失敗\n", prog
); /* K&Rから2つ目のエラー処理、書き出し失敗*/
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKLyogY3VjdjogY3V0Y3N2IOOCouOCr+OCu+OCueODhuOCreOCueODiOOBruODleOCo+ODvOODq+ODieWIh+OCiuWHuuOBlyAqLwovKiDnrKw45q616ZqO44CAY3VjdjguYyAyMDE4MDUxMQoJ5pyA5b6M44Gu5pS56KGM44GE44KJ44Gq44GE44GM44CB5Y+W44KK5ZCI44GI44Ga5L2V44Go44GL44CBbGludXjjga/jgafjgarjgYTjgZPjgajjgavmsJfjgaXjgY8KCeesrDLpoIXjgYvjgonliIfjgorlh7rjgZfjga7mmYLjga7lhYjpoK3jga7jgrPjg7Pjg57jgoLjgYTjgonjgarjgYTjgYzjgIHjgarjgpPjgajjgarjgY/jgZPjga7jgb7jgb4KCeOBl+OBi+OBl+mbo+mWouKAneOAgeKAneWHpueQhuOBq+aMkeaIpiDkvZXjgajjgYsKCTcu44OQ44Kk44OK44Oq44Gu5pmC44KC44Ko44Op44O844Gr44Gq44KL44KI44GG44Gr44GX44Gf44CB5pys5Yem55CG44Gu5LitCgk4LuOCquODl+OCt+ODp+ODs+W8leOBjeWPluOCiuOBq+OBl+OBn+OBhOOAgeWFiOmgreOBjCctJ+OBp+Wni+OBvuOCi+W8leaVsOOCkuODouODvOODieaMh+WumuOBq+OBmeOCiwoJLXUg44Kq44OX44K344On44Oz44Gn44OA44OW44Or44Kz44O844OG44O844K344On44Oz5YaF44Gu44Kz44Oz44Oe44KS44Ki44Oz44OA44O844OQ44O844Gr44GZ44KLCgnjgZPjgozjga9jYXTjga7lvJXmlbDlh6bnkIbjga7loLTlkIjpm6PjgZfjgZ3jgYbjgaDjgIHjgqrjg5fjgrfjg6fjg7PmjIflrprjga/jg6Ljg7zjg4nmjIflrprjgajjgZfjgablj5bjgorlh7rjgZfjgIEKCeOBguOBqOOBrmFyZ3bjgpLliY3jgavoqbDjgoHjgovjgZ3jga7jgYbjgYjjgafjgqjjg6njg7zjg4Hjgqfjg4Pjgq/jgavjgZnjgosKKi8KLyogSyZSIOOBrkNBVOesrDLniYjjgpLmtYHnlKjjgIAKCeW8leaVsOOCkuWFpeWKm+ODleOCoeOCpOODq+WQjeOAgeWIh+OCiuWHuuOBl+ODleOCo+ODvOODq+ODieOBruaWh+Wtl+WIl+OBq+OBmeOCiwoJ5Ymv6Zai5pWw44Gv44GE44KJ44Gq44GEIOani+mAoOOCkuOCt+ODs+ODl+ODq+OBqwoqLwoJCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKCUZJTEUgKmZwOwoJY2hhciAqcHJvZyA9IGFyZ3ZbMF07IC8qIOODl+ODreOCsOODqeODoOWQjeOAguOCqOODqeODvOihqOekuuOBp+S9v+OBhiAqLwoJaW50IGMsbixobDsKCWludCBmbGRubyA9IDE7IC8q44OV44Kj44O844Or44OJ55Wq5Y+3ICovCglpbnQgZHFmbGFnID0gMDsgLyrjg4Djg5bjg6vjgrPjg7zjg4bjg7zjgrfjg6fjg7PlhoXjga7jgrPjg7Pjg57lh6bnkIbjga7jgZ/jgoHjga7jg5Xjg6njgrDjgIBib29s44Gn44KI44GE44GL44KCKi8KCWludCBoaWtpbm87IC8qIOW8leaVsOeVquWPt+avlOi8gyovCgljaGFyIGg7IC8qICDlvJXjgY3mlbDjga7mloflrZcgKi8KCWludCBtb2RlID0gMDsKCQkJLyrjgqLjg7Pjg4Djg7zjg5Djg7zlh7rlipvjga7jgZ/jgoHjga7jg6Ljg7zjg4njgIFib29s44Gn44KI44GE44GL44KC44CBCgkJCeOBqOOCiuOBguOBiOOBmuOCquODl+OCt+ODp+ODs+Wil+OBiOOCi+OBqOOBjeOBruOBn+OCgWludAoJCQkqLwoJCgkvKuOCqOODqeODvOWHpueQhiDlvJXjgY3mlbDjg4Hjgqfjg4Pjgq/jgarjgakqLwoJaWYgKGFyZ2MgPT0gMSB8fCBhcmdjID09Mil7IC8qIOW8leaVsOOBquOBl+WPiOOBr+ODleOCoeOCpOODq+WQjeOBruOBv+OBruWgtOWQiO+8muewoeWNmOOBquS9v+OBhOaWuSAqLwoJCWZwcmludGYoc3RkZXJyLCAiJXM644Ki44Kv44K744K544OG44Kt44K544OI44Gu44OV44Kj44O844Or44OJ5YiH44KK5Ye644GXXG4iLCBwcm9nKTsKCQlleGl0ICgxKTsKCX0KCWlmICgoZnAgPSBmb3Blbihhcmd2WzFdLCAiciIpKSA9PSBOVUxMKXsgLyog44OV44Kh44Kk44Or44Kq44O844OX44Oz44Gv56ys5LiA5byV5pWw44Gu44G/44Gr44GZ44KLKi8KCQlmcHJpbnRmKHN0ZGVyciwgIiVzOuODleOCoeOCpOODq+OCquODvOODl+ODs+WkseaVlyAlc1xuIiwgcHJvZywgYXJndlsxXSk7IAoJCWV4aXQoMSk7IAoJfQoJZm9yIChoaWtpbm8gPSAyOyBoaWtpbm8gPCBhcmdjOyBoaWtpbm8rKyl7IAoJCS8q56ysMuW8leaVsOS7pemZjeOBjCctJyYndSfjga7mmYIKCQkndSfjgZjjgoPjgarjgYTmmYLjgqjjg6njg7zjgIEndSfjga7mmYIKCQnjg6Ljg7zjg4noqK3lrprjgZfjgIFhcmd244KS5YmN44Gr6Kmw44KB44KLCgkJZXJyb3Ig44GL44GI44KM44Gq44GECgkJKi8KCQloID0gYXJndltoaWtpbm9dWzBdOwoJCWlmICggaCA9PSAnLScpewoJCQloID0gYXJndltoaWtpbm9dWzFdOwoJCQlpZiggaD09ICd1Jyl7CgkJCQltb2RlID0gMTsKCQkJCWZvciAobiA9IGhpa2lubyA7IG4gPCBhcmdjIDsgbisrKSBzdHJjcHkgKGFyZ3Zbbl0sIGFyZ3ZbbisxXSk7CgkJCQlhcmdjIC0tOwoJCQl9CgkJCWVsc2V7CgkJCQlmcHJpbnRmKHN0ZGVyciwiJXM644Kq44OX44K344On44Oz44GvLXXjgaDjgZHjgIBcbiIsIHByb2cpOwoJCQkJZXhpdCAoMSk7CgkJCX0KCQl9Cgl9Cglmb3IgKGhpa2lubyA9IDI7IGhpa2lubyA8IGFyZ2M7IGhpa2lubysrKXsgCgkJLyrnrKwy5byV5pWw5Lul6ZmN44GM6Ieq54S25pWw44Gn44Gq44GE5pmCCgkJ5pyA5aSnMjU144GP44KJ44GE44Gg44GL44KJ44CA5paH5a2X5YiX44Gu5ZCE5qGB44GMQVNDSeaVsOWApOOBp+OBguOCi+OBk+OBqOOCkueiuuOBi+OCgeOCiwoJCeW8leaVsOOBrumVt+OBlTPmloflrZfku6XkuIvjgIHlkITmloflrZfjgYzmlbDjgafjgYLjgovjgZPjgajjgIEKCQlhcmd2IOOCkuOAgDLmrKHlhYPphY3liJfjgajjgZfjgabjgqLjgq/jgrvjgrnjgIDjgZPjgaPjgaHjgYzpm6PplqLjgaDjgaPjgZ8KCQkqLwoJCWhsID0gc3RybGVuKGFyZ3ZbaGlraW5vXSk7CgkJaWYgKCBobCA+IDMpewoJCQlmcHJpbnRmKHN0ZGVyciwiJXM644OV44Kj44O844Or44OJ5oyH5a6a44Gv5pW05pWw77yT5qGB44G+44GnXG4iLCBwcm9nKTsKCQkJZXhpdCAoMSk7CgkJfQoJCWZvciAoIG4gPSAwIDsgbiA8IGhsICA7IG4rKyl7CgkJCWggPSBhcmd2W2hpa2lub11bbl07CgkJCWlmIChoIDwgJzAnIHx8IGggPiAnOScpewoJCQkJZnByaW50ZihzdGRlcnIsIiVzOuODleOCo+ODvOODq+ODieaMh+WumuOBr+aVtOaVsFxuIiwgcHJvZyk7CgkJCQlleGl0ICgxKTsKCQkJfQoJCX0KCX0KCgkvKuacrOWHpueQhiovCgl3aGlsZSgoYyA9IGdldGMoZnApKSAhPSBFT0YpewoJCS8qeGxz44Gq44KT44GL44Gu5pmC44KC44Ko44Op44O85Yem55CGCgkJ44GT44GT5Lul5aSW44Gr5aC05omA44GM44Gq44GE5rCX44GM44GZ44KL44GM44CBCgkJ5qeL6YCg55qE44Gr5YiG44GL44KK44Gr44GP44GP44Gq44Gj44Gf5rCX44GM44GZ44KLCgkJ44GE44Gj44Gd5YWI44Gr5YWo6YOo6Kqt44G/44Gf44GP44Gq44KLCgkJKi8KCQlpZiAoYyA8PSA4ICl7CgkJCWZwcmludGYoc3RkZXJyLCIlczrjgYrjgZ3jgonjgY/jg5DjgqTjg4rjg6rjg5XjgqHjgqTjg6vjgafjgZnjgIIlc+OCkumWieOBmOe1guS6huOBl+OBvuOBmVxuIixwcm9nLGFyZ3ZbMV0pOwoJCQlmY2xvc2UgKGZwKTsKCQkJZXhpdCAoMSk7CgkJfQoJCS8q44OA44OW44Or44Kz44O844OG44O844K344On44Oz44Gu5Yem55CG44CAMuWAi+OBvuOBp+OCs+ODs+ODnuOCkuaVsOOBiOOBquOBhOOBk+OBqOOAgCovCgkJaWYgKGMgPT0gJyInICkgKytkcWZsYWc7CgkJCQoJCWlmIChjID09ICcsJykgewoJCQlpZiggZHFmbGFnID09IDApICsrZmxkbm87CgkJCWVsc2UgaWYoIGRxZmxhZyA9PSAyKSB7CgkJCQkrK2ZsZG5vOwoJCQkJZHFmbGFnID0gMDsKCQkJfQoJCX0KCgkJLyrjgYLjgajjga/lhajpg6jjga7mrovjgaPjgZ/lvJXmlbDmloflrZfliJfjga7mlbDlgKTjgahmbGRub+OBjOWQjOOBmOaZguOBoOOBkeWHuuWKm+OBmeOCi+OAgeOBp+OCiOOBhOOBr+OBmgoJCe+8keOAgOODleOCo+ODvOODq+ODieaVsOOBruOCq+OCpuODs+ODiOOAgeWkieaVsGZsZG5ub+OAgO+8keOBp+WIneacn+WMluOBiwoJCe+8kuOAgOesrDPku6XpmY3jga7lvJXmlbDjgajjga7mr5TovIMKCQnvvJPjgIDlkIjoh7TjgZfjgabjgZ/jgonlh7rlipsKCQnvvJTjgIDjgZ3jga7jgYbjgYjjgafmlLnooYzjgYvjganjgYbjgYvjg4Hjgqfjg4Pjgq/jgIHmlLnooYzjga7mmYLjgIFmbGRub+OCkuabtOaWsOOBl+OAgeaUueihjOOCkuWHuuWKm+OBmeOCiwoJCSovCgkJZm9yIChoaWtpbm8gPSAyOyBoaWtpbm8gPCBhcmdjOyBoaWtpbm8rKykKCQlpZiAoZmxkbm8gPT0gYXRvaShhcmd2W2hpa2lub10pKXsKCQkJaWYgKCBjID09ICcsJyAmJiBkcWZsYWcgPT0gMSAmJiBtb2RlID09IDEpIHB1dGMoJ18nLCBzdGRvdXQpOwoJCQllbHNlIHB1dGMoYywgc3Rkb3V0KTsKCQl9CgkJaWYgKGMgPT0gJ1xuJykgewoJCQlmbGRubyA9IDE7CgkJCXB1dGMoYywgc3Rkb3V0KTsKCQl9Cgl9CglmY2xvc2UoZnApOwoKCWlmIChmZXJyb3Ioc3Rkb3V0KSkgewoJCWZwcmludGYoc3RkZXJyLCAiJXM6IOabuOOBjeWHuuOBl+WkseaVl1xuIiwgcHJvZyk7CgkJLyrjgIBLJlLjgYvjgoky44Gk55uu44Gu44Ko44Op44O85Yem55CG44CB5pu444GN5Ye644GX5aSx5pWXKi8KCQlleGl0ICgyKTsKCX0KCWV4aXQgKDApOwp9Cgo=