アレルギー対策、自宅でできる効果的な方法とは?

正規表現で コロン” . ”の連続をどう区別するか悩んでいます

例えば以下のような文字列
(行頭から始まる文章)
----------------------------------------

.おはよう   
..こんばんにゃ
...さよなら

----------------------------------------
コロン” . ”の連続を区別し、そして
文末まで全部取りこむ必要があるのが難しいところです

こうすると上の三行の例の全部が含まれてしまう
^[\.?].*

コロン” . ”1個だけで始まる文の
.おはよう だけ 文末まで取得

コロン” . ”2個で始まる文の
..こんばんにゃ を 文末まで取得

と区別したいときはどうしたらいいのでしょう?

説明するとややこしいのですが
用途は 秀丸のアウトラインの強調文字表現をしたいため

質問者からの補足コメント

  • まとめてお礼します。

    ” . ” は 確かにコロンではないです。
    スムーズに言い間違えると あとも釣られて間違うもんですよね(笑)

    #1の回答へ
    完全にはダメでした

    #2の回答へ
    同じ方法を考えていました
    原理はわかるのですが、実際、その方法でもできましたが
    #3方法がわかりやすかった

    #3の回答
    否定先読み というのがあるんですね。
    おかげ様でシンプルで実現できました。

    素早く解決でき、みなさんいろいろありがとうございました!

      補足日時:2017/03/19 22:01

A 回答 (4件)

No.3の回答者です。


No.2の回答者さんが指摘されたようにコロンではなくピリオドですね。

回答の一部に質問文をコピペしているので、確認しないで回答に利用
していました。

正しくは

ピリオド” . ”1個だけで始まる文の場合
^[\.](?!\.).*
または
^[\.]{1}(?!\.).*

ピリオド” . ”2個だけで始まる文の場合
^[\.]{2}(?!\.).*

ピリオド” . ”3個だけで始まる文の場合
^[\.]{3}(?!\.).*

でしたね。
    • good
    • 0

コロン” . ”1個だけで始まる文の場合


^[\.](?!\.).*
または
^[\.]{1}(?!\.).*

コロン” . ”2個だけで始まる文の場合
^[\.]{2}(?!\.).*

コロン” . ”3個だけで始まる文の場合
^[\.]{3}(?!\.).*

否定的先読みで指定した回数以上のコロンがないものを検索します。
「この正規表現を教えて!」の回答画像3
    • good
    • 0

まず最初に


「.」 は「ピリオド」です。「ドット」と呼ぶこともあります。
コロンは「:」です。ピリオドを縦に二つ並べた形をしています。


プログラム中で使うのなら、「先頭の連続する . 」にマッチさせ、その長さを求めればいいのですが、
強調設定用だと、一つずつパターンを記述することになります。
そのパターンは次の通りです
(1) . 1つ
 (1-1) 「.」 だけ
 (2-2) 「.」 の直後に 「.でない文字」 が有り、
(2) . 2つ
 (2-1) 「..」 だけ
 (2-2) 「..」 の直後に 「.でない文字」 が有り、
(3) . 3つ
 (3-1) 「...」 だけ
 (3-2) 「...」 の直後に 「.でない文字」 が有り、

これを
強調1 : (1-1)のパターン
強調1 : (1-2)のパターン
強調2 : (2-1)のパターン
強調2 : (2-2)のパターン
強調3 : (3-1)のパターン
強調3 : (3-2)のパターン
と設定すれば、それぞれに色分けされます。



今、手許に秀丸が無いので、確認まではできないのですが。

^[\.?].*

の[] の中では、各種特殊記号は、特殊な意味を持たなくなります。( ヘルプを参照のこと )
「.」 は「任意の一文字」という意味を失い、ただの「. という文字」になります。
なので、 現状では? は「?と言う文字」になり
?なんのこと?
にも該当するはずです。
※ 例外は \ と ] です。 \. が「 \と.」と解釈されるのか、エスケープされて「.」と解釈されるのかは、確認できてません。

また、「特殊文字としての . 」 は「通常文字 . 」にもマッチするので、「..こんばんにゃ」は
[\.?]にマッチ: .
.*にマッチ: .こんばんにゃ
となります。これを防ぐには、 今 .* を使っている部分を、 「. で始まらない」と変える必要があります
合せると
^\.[^.].*$
これが、(1-2)のパターンです。
後ろに続かない
^\.$
が(1-1)です。
    • good
    • 0

以下でどうですか?



1個の場合
^\.[^\.]*

2個の場合
^\.\.[^\.]*
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QWindows コマンドの使い方を教えてください

自分のノートパソコンにEDIUS Pro 8というソフトをインストールしたいのですが、
うまくインストールできず、ホームページで方法を調べたところ、
以下のようにすればいいと出てきたのですが、コマンドの使い方がわかりません。。
1.コマンドプロンプトを開きます、までしか分からず、CDコマンドもカレントディレクトリも分かりません。。
具体的にどう打ち込めばよいのかわかりませんので、どなたか教えていただけませんでしょうか。


1) コマンドプロンプトを開きます。
2) CDコマンドを使用してEDIUSのインストーラーがある場所にカレントディレクトリを移動させます。
3) EDIUS インストーラーファイル名を入力し、その後にSkipCheckWindowsUpdatePatch=1 オプションを付けて実行します。
  例) EDIUS_8.20_0623_DL_Setup.exe SkipCheckWindowsUpdatePatch=1
4) インストールが始まりますので、画面の指示に従ってインストールします。

足りない情報がありましたらご教示いただけると幸いです。

自分のノートパソコンにEDIUS Pro 8というソフトをインストールしたいのですが、
うまくインストールできず、ホームページで方法を調べたところ、
以下のようにすればいいと出てきたのですが、コマンドの使い方がわかりません。。
1.コマンドプロンプトを開きます、までしか分からず、CDコマンドもカレントディレクトリも分かりません。。
具体的にどう打ち込めばよいのかわかりませんので、どなたか教えていただけませんでしょうか。


1) コマンドプロンプトを開きます。
2) CDコマンドを使用してEDIU...続きを読む

Aベストアンサー

>これは「D:」に飛ぶ必要があるということでしょうか。
その場合は、
「D:」と入力してください。(CDは不要です)(これはドライブの変更です)
ドライブがD:\になったあとでCDコマンドを使ってください。

Q歌のタイトルをゲームのタイトルにしてはいけないのですか?

私はscratchというプログラミングサイトなどでゲーム・アニメーションを作っています。
それで今度、「エリーゼのために」というアニメを作ろうと思っているのですが。
女神の名前がエリーゼで、女神のために生贄を…女神のためにエリーゼの花を…とかいう意味合いです。
ダメですかね?
曲とはそんなに関係ないのですが。

Aベストアンサー

まぁゴロツキの商標ヤクザがいるので気をつけるに越したことはありません
とくに一般名詞ではないものを利用する場合は権利者がいる可能性を
低く見てはいけません。

別の観点から、すでにある作品に名前を借りるということは
オマージュと言えば聞こえはいいですが、ようはおんぶにだっこを
期待すると見られても否定できません。とくに曲と関連が低いならやめるべきです。

また原曲にもファンがいるので、そのファンがあなたの作品をみて
イメージと違う、けしからん!となって炎上する可能性も
昨今のネットの情勢をみると少なからずあります。

QC言語でのUTF-8の文字列の処理は例えば、比較とかstrtokとかはどうするのか

大量のhtmlファイルを処理をする様になってから今迄はperlを使って来
たが処理が遅いのでC言語を使って早くしようと思って要るが。肝心の
日本語コードの扱いで詰まっている。

例えば、
<!--コメントヘッダーのはじまり-->
.
.
.
<!--コメントヘッダーのおわり-->
と言った場合に、<と>に囲まれた色んなタグが現れて来る。strtokで文
字列を拾って対処をするとしても、文字コードが処理出来なければ何も
進まない。

例えば、上記の場合でhtmlファイルを読んでコメントヘッダーのはじまり
とおわり迄に関しては、出力をしない。他のは全て出力すると言う様な場
合のC言語のソースはどの様に成るのでしょうか。

済みません。未だ、始めたばかりでC言語での記述が出来ません。宜し
く回答願います。

回答はヒントでは無くて直接のC言語のソースを提示願います。宜しく
お願いします。

Aベストアンサー

>回答はヒントでは無くて直接のC言語のソースを提示願います。

これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られたバッファでやりくりしようとするなら(ネットワークからダウンロードしながら処理する際にはこのやり方が必須)、バッファ読み込みの際のタグ文字列の泣き別れなどを考慮する必要がありちょっと凝ったテクニックが必要になります。

それとも、UTF-8で書かれたHTMLの"<!--コメントヘッダーのはじまり-->"~"<!--コメントヘッダーのおわり-->"を全削除ですか?だったら、コードをUTF-8で書いて、strstr()で"<!--コメントヘッダーのはじまり-->”を見つけて・・・でいけると思います。文字コードの処理というよりか、見る人が見れば日本語に見えるかもしれない「ただのデータの列」とみなして処理するだけです。

>回答はヒントでは無くて直接のC言語のソースを提示願います。

これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られた...続きを読む

Qどうすれば本格的なGUIプログラミングができるか

もう学生時代から20年以上も独学でOSの変遷(MS-DOS→ウインドウズ95→98SE→XP→Vista→8.1→10)にともなってコマンドラインのC言語の開発環境を作ってきて勉強を続けてきましたが、一向に満足なプログラムができるようになりません。
(わずかに、値を入力して場合分けして1000回以上の繰り返し計算をして結果を画面出力する、というプログラム程度です。)

仕事はITとは無縁で、材料系の製造業です。化学合成とか分析には詳しいですが、周りにもプログラミングのプの字も知っている人はいません。IT系の会社なんかに勤めていたら、そういうことを知っている人がごろごろいそうな気がしますが、いませんので自分でいろいろな情報源から調べるのみですが、あまり金を掛けませんので情報量にも限りがあります。

今つくりたいのは、ウインドウズのソフトの印刷結果を、ビットマップとかJPEGほか、任意の形式の画像に変換して保存するプログラムです。よく、ベクターとかにアップロードされているようなプログラムを、自分でも作れるようになるのが目標です。

何年かかっても構いません。どういう本を買い、どういう勉強をすればできるようになるのでしょうか。

ちなみに、今のPCのOSはWindows10で、マイクロソフトのVisual Studioをインストールしていて、コマンドラインのC言語のプログラムなら、無料のテキストエディタ(今使っているのはTeraPad)でソースを書いて、コンパイル・リンクして走らせる、ということばかりずっとやっていますが、本格的なウインドウズ上のプログラムを作りたいです。C#なら手っ取り早く作れる、と何かで知って、最近C#の、開発環境の作り方も書いた本を買いましたが、C#で本格的なプログラムができるか、疑問に思っています。いまさらRubyとかPythonを始めるのもどうなんだろうか、と思っています。C++ならできるのでしょうか。C++の入門書も持っています。

どなたかアドバイスをお願い致します。

もう学生時代から20年以上も独学でOSの変遷(MS-DOS→ウインドウズ95→98SE→XP→Vista→8.1→10)にともなってコマンドラインのC言語の開発環境を作ってきて勉強を続けてきましたが、一向に満足なプログラムができるようになりません。
(わずかに、値を入力して場合分けして1000回以上の繰り返し計算をして結果を画面出力する、というプログラム程度です。)

仕事はITとは無縁で、材料系の製造業です。化学合成とか分析には詳しいですが、周りにもプログラミングのプの字も知っている人はいません。IT系の会社なんかに...続きを読む

Aベストアンサー

Windowsのプログラムを作るなら今はC#が最適ですね。
C#言語とフレームワークの.NETはMicrosoftが10年来普及に努めており、今やWindowsの大半の機能を.NET上のみで操れます。
.NET上で動くプログラムを作る言語としてはC#の他にVisualBasicやC++/CLIなどがありますが、情報量の多さと書式がCに似ている点でお勧めはC#です。
名前の通り書式がC言語を元にしているので、Cが分かればC#も、ポインタが(まともな方法では)使えないくらいでだいたい同じことができます。

QC言語のポインターで詰まっている

下記が動かない。多分に、ポインターがおかしいと思うが。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *buf="<title>sample</title>";
char work[256];
char p;

char *out=work;
char *in=buf;

in=strstr(in,"<");
while(strcmp((p=(*out++ = *in++)),"sample") != 0);
printf("%c",p);

//while(strcmp((*out++=*in++),">") != 0);
*out='\0';
printf("%s\n",out);
return 0;
}
01.c: In function 'main':
01.c:14:2: warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast [enabled by default]
while(strcmp((p=(*out++ = *in++)),"sample") != 0);
^
In file included from 01.c:3:0:
c:\mingw\include\string.h:43:37: note: expected 'const char *' but argument is of type 'char'
_CRTIMP int __cdecl __MINGW_NOTHROW strcmp (const char*, const char*) __MINGW_ATTRIB_PURE;

済みません。指摘をお願いします。

下記が動かない。多分に、ポインターがおかしいと思うが。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *buf="<title>sample</title>";
char work[256];
char p;

char *out=work;
char *in=buf;

in=strstr(in,"<");
while(strcmp((p=(*out++ = *in++)),"sample") != 0);
printf("%c",p);

//while(strcmp((*out++=*in++),">") != 0);
*out='\0';
printf("%s\n",out);
return 0;
}
01.c: In function 'main':
01.c:14:2: warning: pass...続きを読む

Aベストアンサー

No.3です。
No.4の方へのお礼を拝見しました。

まず、strcmp()というのは、第1引数のポインタから始まる文字列と第2引数のポインタから始まる文字列とを比較し、一致する場合には0を、そうでない場合には0以外を返す関数です。ちなみに、文字列は最後の'\0'までをすべて比較しますので、これでは永遠に一致しません。この場合、strncmp()という、文字数を制限した比較関数を使います。
例:if (strncmp(start, "title", 5) == 0) { ...

>それならば、ポインターに型変換をする事は出来ないのでしょうか。

Cでは他のスクリプト言語と比べ、変数の表記、とりわけポインタが絡んだ場合にちょっと違う記法になります。

宣言の時:
char *a;

ポインタ(アドレス)として利用する場合:
strncmp(a, "title", 5);

ポインタで示される値を参照する場合:
printf("%c", *a);
→printf("%c", a[0]);と同じ動きになる

質問者様はおそらくこのあたりを混乱されているのだと思います。

>while(strcmp((p=(*out++ = *in++)),"title") != 0);

雰囲気的には、1行でこれを表現しようとしているのでしょうが、こういうことをするぐらいなら普通にブロックで書いた方が分かりやすいです。
while (strncmp(in, "title", 5) != 0) {
*out ++ = *in ++;
}
CはPerlと違い、行数が計算コストになるわけではありません。コンパイラが良しなに最適化してくれます。

さらにちなみにですが、大文字小文字を区別しない場合は、strncasecmp()という関数もあります。必要に応じて活用されればよいと思います。

これでお望みの回答になるのではないでしょうか?

No.3です。
No.4の方へのお礼を拝見しました。

まず、strcmp()というのは、第1引数のポインタから始まる文字列と第2引数のポインタから始まる文字列とを比較し、一致する場合には0を、そうでない場合には0以外を返す関数です。ちなみに、文字列は最後の'\0'までをすべて比較しますので、これでは永遠に一致しません。この場合、strncmp()という、文字数を制限した比較関数を使います。
例:if (strncmp(start, "title", 5) == 0) { ...

>それならば、ポインターに型変換をする事は出来ないのでしょうか。

Cでは...続きを読む

QC言語で詰まっているので教えて下さい。

下記のソースが有ります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name[]="out/";
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n");
return 1;
}
// }}}
// fgetsでのエラー処理 {{{
if(fgets(buf,64000,fp) == NULL){
printf("data error\n");
return 1;
}
// }}}
// <target>が存在しない時のエラー処理 {{{
p=strstr(buf,"<target>");
if(p == NULL){
printf("target not found\n");
exit(1);
}
// }}}

// 最初のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcat(file_name,q);
// }}}

// 出力ファイルのopen処理 {{{
fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
}
// }}}
while(fgets(buf,64000,fp) != NULL){
p=strstr(buf,"<target>");
if(p == NULL){
fprintf(fp2,"%s",buf);
}else{
// 2回目以降のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcat(file_name,q);
// }}}
// 今使っているファイルを閉じて新しいファイルを開く。{{{
fclose(fp2);

fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
} // }}}
}
}
fclose(fp);
fclose(fp2);
return 0;
}

// vim:set fdm=marker:

入力は、result.txtを読んでそれをフィルターする物です。result.txt
は先頭から順に下記の内容で入力されています。

① <target>ファイル名</target>
② 内容のデータ

上記の①から②を繰り返します。フィルターは①のファイル名で続く
データをそのファイルに出力します。フィルターの数は約1万件にな
る。

処理の内容は、最初の<target>の行を読んで出力ファイルをオープンし
ます。続くデータを<target>行が来る迄出力を続行します。

新しく<target>行が来るとこれ迄使っていた出力ファイルを閉じてまた
新規のファイルを出力としてオープンします。

この処理をresult.txtを最後迄読んだら終了となります。今の問題は、
この処理の中で最初の出力ファイルに出力をしている途中で異常終了し
ます。

何処が不味いのか。検討が付きません。どうか助けて下さい。宜しくお
願いします。

下記のソースが有ります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name[]="out/";
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n");
return 1;
}
// }}}
// fgetsでのエラー処理 {{{
if(fgets(buf,64000,fp) == NULL){
printf("data error\n");
return 1;
}
// }}}
/...続きを読む

Aベストアンサー

以下のようにしてください。
修正した箇所と、追加した箇所に//変更、//追加のコメントを入れておきました。
-------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name_base[]="out/"; //変更
char file_name[256]; //追加
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n");
return 1;
}
// }}}
// fgetsでのエラー処理 {{{
if(fgets(buf,64000,fp) == NULL){
printf("data error\n");
return 1;
}
// }}}
// <target>が存在しない時のエラー処理 {{{
p=strstr(buf,"<target>");
if(p == NULL){
printf("target not found\n");
exit(1);
}
// }}}

// 最初のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcpy(file_name,file_name_base); //追加
strcat(file_name,q);
// }}}

// 出力ファイルのopen処理 {{{
fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
}
// }}}
while(fgets(buf,64000,fp) != NULL){
p=strstr(buf,"<target>");
if(p == NULL){
fprintf(fp2,"%s",buf);
}else{
// 2回目以降のファイル名の取得{{{
p=p+strlen("<target>");
q=p;

p=strstr(p,"</target>");
if(p == NULL){
printf("</target> not found\n");
exit(1);
}
*p='\0';
strcpy(file_name,file_name_base); //追加
strcat(file_name,q);
// }}}
// 今使っているファイルを閉じて新しいファイルを開く。{{{
fclose(fp2);

fp2=fopen(file_name,"w");
if(fp2 == NULL){
printf("%s file open err\n",file_name);
exit(1);
} // }}}
}
}
fclose(fp);
fclose(fp2);
return 0;
}
----------------------------------------------------
誤りは2点です。
1)strcat(file_name,q);
file_nameは"out/"が格納できるサイズしか確保されません。
その為、これを実行すると、確保したサイズ以降の領域が破壊されます。
どこが、破壊されるかは、コンパイラの配置によってきまるので、わかりませんが、どこかが破壊されます。
2)2回目のstrcat(file_name,q);を実行すると
前に実行した残骸のあとから更に文字列が追加されます。

上記を解決するためには
char file_name_base[]="out/"; //変更
char file_name[256]; //追加
を確保し、
一旦、
①file_name_baseをfile_nameにコピーし、
②その後で、strcat(file_name,q);
を実行します。
①②は、必ずペアで実行します。
尚、file_nameは暫定的に256バイトにしましたが、もっとファイル名として大きな文字列が存在するなら
もっと大きくしてください。

以下のようにしてください。
修正した箇所と、追加した箇所に//変更、//追加のコメントを入れておきました。
-------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
FILE *fp, *fp2;
char buf[64000];
char *p, *start ,*q ,*r;
char file_name_base[]="out/"; //変更
char file_name[256]; //追加
int ret;

// result.txtのopen error処理 {{{
fp=fopen("result.txt","r");
if(fp == NULL){
printf("result.txt file open err\n...続きを読む

Q正規表現で、行頭の文字列が、!で始まる一行を

で囲みたい

正規表現で、行頭の文字列が、!で始まる文字列を<h1></h1>で囲みたいです
囲むのは!で始まる行の最初から最後までです
次の行は含めません。

検索:^\!
置き換え:

という形式で教えてください

Aベストアンサー

言語がわかりませんが
/^!(.*?)$/m

<h1>$1</h1>
に変えてみては?

Q複数連番付きCSVデータの文字列置換について

かなり、困っております・・・。

「c:\csv_data」に複数の連番csvデータ(file_01.csv,file_02.csv,....)が入っており、
csvファイル内に含まれている"AAA"を"AAA_"+ファイル番号に変換させたいです。(下記の例を参考にして下さい。)

例:file_01.csv→AAAをAAA_01、file_02.csv→AAAをAAA_02、・・・・・

(フォルダ内の全てのcsvを変換させたいです)
一度作ってみたんですが、Excel-VBAでCSVファイルを開いて編集をかけると書式が失われてしまう為、だめでした・・・。
そこで
・Excel-VBAでの良い方法
・BATファイルで拡張子csv⇒txtに開いてからの編集⇒csvへ
といった2つの方法(どちらか)がであれば作業工程上、他の処理と同時に
自動化できることからこの2つの方法での文字列変換方法を知りたいです。

どうかよろしくお願いいたします。

Aベストアンサー

VBAです。以下のマクロを標準モジュールに登録してください。
-------------------------------------------
Option Explicit
Public Sub CSV文字列変換()
Const folder As String = "c:\csv_data"
Dim fname As String
Dim ctr As Long
ctr = 0
fname = Dir(folder & "\" & "file_??.csv", vbNormal)
Do While fname <> ""
ctr = ctr + 1
If CSV_replace(folder, fname) = False Then Exit Sub
fname = Dir()
Loop
MsgBox (ctr & "件のファイルを処理しました")
End Sub

Private Function CSV_replace(ByVal folder As String, ByVal fname As String)
Const target As String = "AAA"
Dim inPath As String
Dim outPath As String
Dim inline As String
Dim outline As String
Dim swd As String
Dim twd As String
CSV_replace = False
swd = """" & target & ""","
twd = """" & target & Mid(fname, 5, 3) & ""","
inPath = folder & "\" & fname
outPath = folder & "\" & "temp_csv.txt"
Open inPath For Input As #1
Open outPath For Output As #2
Do Until EOF(1)
Line Input #1, inline
If Left(inline, Len(swd)) = swd Then
outline = twd & Mid(inline, Len(swd) + 1, Len(inline))
Else
outline = inline
End If
Print #2, outline
Loop
Close #2
Close #1
Kill inPath
Name outPath As inPath
CSV_replace = True
End Function
-------------------------------------------
対象となるファイル名は
file_XX.csv です。(XXは任意の2文字です)
file01.csv,abc_01.csv等は本処理の対象外です。

VBAです。以下のマクロを標準モジュールに登録してください。
-------------------------------------------
Option Explicit
Public Sub CSV文字列変換()
Const folder As String = "c:\csv_data"
Dim fname As String
Dim ctr As Long
ctr = 0
fname = Dir(folder & "\" & "file_??.csv", vbNormal)
Do While fname <> ""
ctr = ctr + 1
If CSV_replace(folder, fname) = False Then Exit Sub
fname = Dir()
Loop
MsgBox (ctr & "件のファイルを処理し...続きを読む

Qプログラマー 契約社員

プログラマーとして契約社員で入社した会社で即戦力とならなければ契約満了するケースは多いですか?

育てるという概念は新卒のみに適用で中途入社は即戦力になりえなければ契約満了という形が多いですか?

Aベストアンサー

契約社員は中途入社とは違います。
中途入社でも育てますが、契約社員は使えなければ交換してもらうことは多いです。
まぁ年齢とかその人の資質にもよりますので一概には言えないと思いますが。

Qしつこい様ですが、再度ポインタについて質問します。

下記は、*inの<title>から<と>で挟まれたtitle
を得るためのソースです。
全くの完全では有りませんが。質問の内容は、
while文の中で、コンパイラーが出すエラーメッセージの
内容が理解出来ません。

下記が出ます。
01.c: In function 'main':
01.c:12:17: warning: assignment makes pointer from integer without a cast [enabled by default]
while(strstr((p=(*out++ = *in++)),">") !=0);
^
while文の中でのエラーで、キャスト無しの整数からポインターを作っているので
strstrの最初の引数を飛ばしました(デフォルトで有効)無視しました。と言う意味ですが。

要はこれはポインターで無いのでstrstrの引数としては無効ですと言う事でしょうか。
それであれば、ここではポインターに変換しないといけませんが。

実はこれに関しては、前の質問でその方法と言うのは分かったのですが。どうしても、ここでは
将来の勉強と言う意味で理解をしたかった物ですから質問をしました。

このエラーメッセージが出ない様にするためにはソースのどこを変更
すれば良いのでしょうか。今度は、コードがどうのこうのではなくて
説明をお願いします。

よろしくお願いします。後学の為にどうしても理屈を知りたかった物ですから。
宜しくお願いします。

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

int main() {
char *in="<title>";

char work[256];
char *out=work;
char *p;

while(strstr((p=(*out++ = *in++)),">") !=0);
*out='\0';
printf("%s",work);

return 0;
}

下記は、*inの<title>から<と>で挟まれたtitle
を得るためのソースです。
全くの完全では有りませんが。質問の内容は、
while文の中で、コンパイラーが出すエラーメッセージの
内容が理解出来ません。

下記が出ます。
01.c: In function 'main':
01.c:12:17: warning: assignment makes pointer from integer without a cast [enabled by default]
while(strstr((p=(*out++ = *in++)),">") !=0);
^
while文の中でのエラーで、キャスト無しの整数からポイ...続きを読む

Aベストアンサー

No1です。
>これを作るに当ってのプログラム作成の問題は解決をしていますので。
>最後に今回の説明の回答で暴走すると言う所が気になっています。
>最後にこの暴走と言う所の質問の回答をお待ちしています。

これを以下のような部分を追加しました。
追加したしたのは、変数の内容を印字するだけなので、本来の動作には影響しません。
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=work;
char *p;

printf("ascii code of(<)=%d\n",'<');
printf("in_size=%d out_sieze=%d\n",sizeof(in),sizeof(out));
printf("in=%x out=%x\n",in,out);

while(strstr((p=(char*)(int)(*out++ = *in++)),">") != 0);
*out='\0';
printf("%s",work);

return 0;
}
----------------------------------
これを実行すると、添付の図のようになります。
OSにより強制終了させられます。
このように強制終了させられる原因はいろいろありますが、今回は
ROM領域をアクセスしているのが原因と考えられます。
まず、pのあたいですが、"<"のアスキーコードの値:60が設定されます。
strstr(p,">")の意味は、60番地から">"の文字列が存在する箇所を探しなさい。
ということになります。60番地はROMの領域になるはずで、OSはこのような領域を一介のアプリプログラムが
アクセスすることを禁止しています。その為、強制終了させられます。(これが暴走の意味です)
通常、pは、アプリケーションプログラムが確保した領域のアドレスが設定されるはずで、
inのアドレスが設定されるなら、添付の図のように403064(16進数)のような値になるはずです。

No1です。
>これを作るに当ってのプログラム作成の問題は解決をしていますので。
>最後に今回の説明の回答で暴走すると言う所が気になっています。
>最後にこの暴走と言う所の質問の回答をお待ちしています。

これを以下のような部分を追加しました。
追加したしたのは、変数の内容を印字するだけなので、本来の動作には影響しません。
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char *in="<title>";

char work[256];
char *out=wo...続きを読む


人気Q&Aランキング

おすすめ情報