文字列の中から1文字のものを除去or空白文字に置き換える考え

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
blade

文字列の中から1文字のものを除去or空白文字に置き換える考え

#1

投稿記事 by blade » 13年前

先ほどここで質問した者です。
要求が変わって、またわからなくなったので質問させていただきます。

あるテキストデータがあるとします。例えば以下の様なものなのですが

コード:

zoom v 3 3 @ ~ + 3 1 02059445 02060133 01947577  
zoom_along v 1 1 ! @ 1 0 02059445  
zoom_in v 1 1 @ 1 0 02157683  
この中から各々の行において1文字だけで構成されている箇所を消したいのですがいい方法はありますでしょうか。
単語、数字間はスペースで開けたいです。

つまり、出力結果は

コード:

zoom  02059445 02060133 01947577  
zoom_along  02059445  
zoom_in  02157683  
のようにしたいと考えています。

・単語 1文字群 8桁の数字 の順番は統一されています。
・“8桁の数字”というのは統一されています。
 ・その数は単語毎にバラバラです(1~8個ほど)。
・1文字で表されるものはアルファベット、数字、記号と様々です。
 ・その数は単語毎にバラバラです(3~10個ほど)。 
・1行毎のはじめにある英単語は1つだけとなっています。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#2

投稿記事 by みけCAT » 13年前

適材適所です。

コード:

#!/usr/bin/perl

while(<STDIN>) {
	chomp($_);
	$data=$_;
	$data =~ s/ /  /g;
	$data=" $data ";
	$data =~ s/ \S //g;
	$data =~ s/^ //;
	$data =~ s/ $//;
	$data =~ s/  / /g;
	$data =~ s/ /  /; # 最初の単語の後のスペースを2個にする
	print "$data\n";
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

non
記事: 1097
登録日時: 15年前

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#3

投稿記事 by non » 13年前

すべての語句で改行して良いなら、
while (fscanf(fp,"%s",onaji) != EOF) {
に変更するだけ。
しかし、改行を考慮するなら、もう一工夫必要。
non

box
記事: 2002
登録日時: 15年前

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#4

投稿記事 by box » 13年前

仕様を満たしているかどうか、保証の限りではありません。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(void)
{
    char str[128];      // 大きさは適切に確保すること
    FILE *fp;

    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        fprintf(stderr, "file open error.\n");
        exit(1);
    }

    while (fgets(str, sizeof(str), fp) != NULL) {
        char *p, *dlm = " ";

        str[strlen(str)-1] = '\0';
        p = strtok(str, dlm);
        while (p != NULL) {
            if (strlen(p) != 1) {
                printf("%s%s ", p, (isalpha(*p) ? " " : ""));
            }
            p = strtok(NULL, dlm);
        }
        putchar('\n');
    }
    fclose(fp);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

blade

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#5

投稿記事 by blade » 13年前

みけCAT さんが書きました:適材適所です。

コード:

#!/usr/bin/perl

while(<STDIN>) {
	chomp($_);
	$data=$_;
	$data =~ s/ /  /g;
	$data=" $data ";
	$data =~ s/ \S //g;
	$data =~ s/^ //;
	$data =~ s/ $//;
	$data =~ s/  / /g;
	$data =~ s/ /  /; # 最初の単語の後のスペースを2個にする
	print "$data\n";
}
回答ありがとうございます。
perlはほとんど触ったことがなく、ネットで調べながらみけCATさんのコードをいじったのですがうまく出力されません(以下のコード)。
ファイルから一行ずつ読み込み、同じ処理を行おうと思ったのですが、空白行が出力されただけになってしまいました。
どこが悪いのか教えてください、よろしくお願いします。
※sample.txtは初めの質問に書いたzoomから始まる3行のテキストです。

コード:

#!/usr/bin/perl
 
 
open(DATAFILE, "sample.txt") or die("error :$!");

while (my $line = <DATAFILE>){
   chomp($line);
    $data=$line;
    $data =~ s/ /  /g;
    $data=" $data ";
    $data =~ s/ \S //g;
    $data =~ s/^ //;
    $data =~ s/ $//;
    $data =~ s/  / /g;
    $data =~ s/ /  /; # 最初の単語の後のスペースを2個にする

}
close(DATAFILE);


かずま

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#6

投稿記事 by かずま » 13年前

Linux か、Windows の cygwin なら、sed が使えます。

コード:

$ cat test.txt
zoom v 3 3 @ ~ + 3 1 02059445 02060133 01947577  
zoom_along v 1 1 ! @ 1 0 02059445  
zoom_in v 1 1 @ 1 0 02157683
$ sed ':a;s/ [^ ] / /;ta;s/ /  /' test.txt
zoom  02059445 02060133 01947577  
zoom_along  02059445  
zoom_in  02157683
$ 

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#7

投稿記事 by みけCAT » 13年前

bladeさんのコードだとデータを出力していません。

コード:

$data =~ s/ / /; # 最初の単語の後のスペースを2個にする
の後に

コード:

print "$data\n";
を追加してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

blade

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#8

投稿記事 by blade » 13年前

みけCAT さんが書きました:bladeさんのコードだとデータを出力していません。

コード:

$data =~ s/ / /; # 最初の単語の後のスペースを2個にする
の後に

コード:

print "$data\n";
を追加してください。
なぜかいじったときに消してしまっていたようです(汗)

単純な質問でしたのに答えていただきありがとうございました。
追加したらうまくいきました。

かずま

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#9

投稿記事 by かずま » 13年前

scanf と printf だけで書いてみました。変数は w 1個だけ。

コード:

#include <stdio.h>

int main(void)
{
    char w[256];
    while (scanf("%255s", w) == 1) {
        printf("%s ", w);
        while (scanf("%*[ ]"), scanf("%255[^ \n]", w) == 1)
            if (w[1]) printf(" %s", w);
        if (scanf("%c", w) == 1) printf("\n");
    }
    return 0;
}

かずま

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#10

投稿記事 by かずま » 13年前

sed の代わりに awk を使うと、

コード:

$ cat test.txt
zoom v 3 3 @ ~ + 3 1 02059445 02060133 01947577  
zoom_along v 1 1 ! @ 1 0 02059445  
zoom_in v 1 1 @ 1 0 02157683
$ awk '{sub(/( [^ ])+ /,"  ");print}' test.txt
zoom  02059445 02060133 01947577  
zoom_along  02059445  
zoom_in  02157683
$ 

かずま

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#11

投稿記事 by かずま » 13年前

awk の代わりに perl を使うと、

コード:

$ cat test.txt
zoom v 3 3 @ ~ + 3 1 02059445 02060133 01947577  
zoom_along v 1 1 ! @ 1 0 02059445  
zoom_in v 1 1 @ 1 0 02157683
$ perl -p -e 's/( \S)+ /  /' test.txt
zoom  02059445 02060133 01947577  
zoom_along  02059445  
zoom_in  02157683
$ 

かずま

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#12

投稿記事 by かずま » 13年前

getchar() と putchar() だけで書いてみました。

コード:

#include <stdio.h>

int sep(int c) { return c == ' ' || c == '\n' || c == EOF; }
int skip(void) { int c; while ((c = getchar()) == ' ') ; return c; }
int word(void) { int c; while (!sep(c = getchar())) putchar(c); return c; }

int main(void) {
    int c, c2;
    for ( ; (c = word()) != EOF; putchar('\n'))
        for (putchar(' '); c != '\n' && c != EOF; )
            if ((c = skip()) != '\n' && !sep(c2 = getchar()))
                putchar(' '), putchar(c), putchar(c2), c = word();
    return 0;
}

blade

Re: 文字列の中から1文字のものを除去or空白文字に置き換える考え

#13

投稿記事 by blade » 13年前

他にこんなにいろいろな方法を示していただき、ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る