• 締切済み

matlabでの文字列の比較

Matlabの初心者です。 CSVファイルを読み込んで、その中から特定の文字列がどこにあるかを探したいと思っています。 最初にすべてのデータを読み込んで all= textscan(fid, '%s', 'delimiter', '\n'); idata=all{1,1}; x=find(cellfun('isempty',idata)); idata(x)=[]; data_s=whos('idata'); adata=cell(data_s.size(1),10); for n=1:data_s.size; dummy=strtrim(textscan(idata{n},'%q %q %q %q %q %q %q %q %q %q','delimiter',',')); % dummy=regexp(idata{n},',','split'); for i=1:10; adata{n,i}=dummy{i} ; end gg=strcmp(dummy,'《ファイル情報》') end と行ってみましたが、変数で見ると文字列「《ファイル情報》」がありますが、比較では0となり検出できません。 変数表示のところで、同じ所にコピー、貼り付けを行うと検出するようになります。 何か、表示では見えない文字が入っているのかもしれませんが、どのように調べれば良いのかわかりません。よろしくご教授ください。

みんなの回答

  • remoC0N
  • ベストアンサー率40% (2/5)
回答No.2

すいません、そういう事を聞いてるのではないので 分からない人は回答をご遠慮願います

回答No.1

gg=strcmp([dummy{:}], '《ファイル情報》')

関連するQ&A

  • 文字列の比較について

    C++で勉強しているのですが、 下のような内容のファイルをつくり、プログラムで 左辺を検索して右辺の数字を読み込むには どうしたらよいでしょうか? ただし、1字1字の検索ではなく3文字なら3文字を 検索して右辺の数字を読み込むようにするような簡潔な プログラミングを望んでます。 (1文字ごとの検索なら簡単にできるのですが めちゃくちゃ汚いソースになったので完結にしたいのです。) -----------------------File Start opt = 1;      オプション番号 temp = 2;      テンポラリ位置 link =3;       リンカー場所 data=4;       データの種類 hoehoe = 5;    ほえほえの種類 -----------------------File END 例: dataという文字を探してその文字の右辺を読み取りたいのです。 セミコロンより右は読まないようにしたいのです。 宜しくお願いします。

  • 文字列中にURLを見つけたら、リンクとして出力したい

    お疲れ様です。 いつもお世話になっております。 私はPHP書きなので、PHPではすぐかけるのですが、今回はJSに埋め込まなければならないため、頭を抱えています。 PHPだとこういうことです---------------------------- preg_match_all('/(http(s?):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/', $text, $delimiter); array_pop($delimiter); for( $i = 0;$i < count($delimiter[0]);$i++){ $text = str_replace($delimiter[0][$i], "<a href='{$delimiter[0][$i]}'>{$delimiter[0][$i]}</a>", $text); } --------------------------------------------ここまで たとえば var str = "今日は晴れだった。天気予報はhttp://www.jma.go.jp/jma/index.htmlで見られる。"; という文字列があった場合、 var str = "今日は晴れだった。天気予報は<a href="http://www.jma.go.jp/jma/index.html">http://www.jma.go.jp/jma/index.html</a>で見られる。"; と置換したいのです。(タグ回避のため<>は全角です) サンプルのURLは気象庁のページです。 str.match();で、一致させることはできるのですが、それをどうやって、タグでくるめばよいのかが分かりません。 解説しているサイトか、スクリプトを載せていただけると助かります。 よろしくお願いします。

  • ファイルの入出力を行っての文字列反転

    入力した文字列を反転させて出力したいのですが どうしたらよいでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> /* 定数 */ #define DELIMITER "/ ," /* 区切り文字 */ int main(void) { FILE *fin,*fout; char infile[40],outfile[40],s[256],s2[256]; char *token; char *strch[50]; int count = 0; int i; printf("入力ファイル名="); gets(infile); printf("出力ファイル名="); gets(outfile); if( (fin=fopen(infile,"r"))==NULL) { /* 入力ファイルオープン */ printf("入力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } if( (fout=fopen(outfile,"w"))==NULL) { /* 出力ファイルオープン */ printf("出力ファイルがオープンできません\n"); exit(EXIT_FAILURE); } while(fgets(s,256,fin)!=NULL) { /* 入力ファイルから読み込んだデータを */ token = strtok(s, DELIMITER); while (token != NULL) { strch[count] = token; token = strtok(NULL, DELIMITER); count++; } for(i = count; i > 0; i--) { strcat(s2, strch[i]); } fputs(s2,fout); /* 出力ファイルに書き込み */ } fclose(fin); /* 入力ファイルクローズ */ fclose(fout); /* 出力ファイルクローズ */ return 0; }

  • matlabでの改行文字について

    matlabでのテキストファイルの書き換えを行いたいのですが,改行文字の検出ができません.(C言語では作れますが,matlabで作りたいのです.) 例として以下のファイル(read.txt)の書き換えの方法を教えてください. start 0 1 2 abcdef 0 1 2 3 4 xyz end 上のファイルにおいて,abcdef以下の01234を他のファイルに書き換えたく,以下のスクリプトを作成しました. Path1='read.txt'; Path2='write.txt'; judge=0; Fid1=fopen(Path1,'rt'); Fid2=fopen(Path2,'wt'); while feof(Fid1)==0 Line=fgets(Fid1); if Line=='\n' judge=0; elseif judge==1 fprintf(Fid2,'%s',Line); end if strcmp(Line,'abcdef\n')==1 judge=1; end end fclose(Fid1); fclose(Fid2); end ここで,知りたいのは「Line=='\n'」と「strcmp(Line,'abcdef\n')==1」の条件文がうまく働いてない理由です.これを実行すると何も書かれてないファイルが作成されます. strncmp(Line,'abcdef',6)とするとこちらはうまく認識しますが,改行文字のみの行の検出はどのようにして行えばよいのでしょうか.

  • csvファイルを構造体に読み込みたい

    C言語初心者です。 csvファイルのデータを1行ずつ構造体に読み込みたいのですが、うまくできません。 #define MAX_SIZE 100 char filename[] = ″test.csv"; struct ALL_DATA{ int cnt; char list[10]; char addr[10]; char cmd[10]; char csize[10]; char input[10]; char icmd[10]; char input2[10]; }; for (int lp = 0; lp < 10; lp++){ FILE *fp; struct ALL_DATA ADATA[MAX_SIZE]; // 構造体配列の宣言 if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%d,%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],\n", &ADATA[fc].cnt, ADATA[fc].list, ADATA[fc].addr,ADATA[fc].cmd,ADATA[fc].csize,ADATA[fc].input,ADATA[fc].icmd,ADATA[fc].input2); } } fclose(fp); while (i < MAX_SIZE){ printf("ADATA[i].cnt -> %d, ADATA[i].list -> %s, ADATA[i].addr -> %s, ADATA[i].cmd -> %s, ADATA[i].csize -> %s, ADATA[i].input -> %s, ADATA[i].icmd -> %s, ADATA[i].input2 -> %s\n",ADATA[fc].cnt, ADATA[fc].list,ADATA[fc].addr,ADATA[fc].cmd,ADATA[fc].csize,ADATA[fc].input,ADATA[fc].icmd,ADATA[fc].input2); i++; } } 読み込みたいcsvデータは 1 test 0x0012 write 0x001 yes 0xabc yes 2 testa 0x00cd read 0x024 0x1a3 のように、「数字、文字列・・・」と並んでいます。 このデータを取り込んで表示させたところ、 最初の数字は問題ないのですが、ADATA[i].addr から値がおかしくなり、 ADATA[i].addr = 0x0012write ADATA[i].cmd = write ADATA[fc].csize = 0x001yes のように、16進数を文字列として構造体に入れるときに、次の文字(英字)まで一緒に含んでしまう現象が出ております。 ネットで調べて、csvファイルから構造体に取り込む方法はいくつか見たのですが、同じようにしている(と思っている)のにうまくいかないため、質問させていただきました。 原因がわかる方がいらっしゃいましたら、アドバイスをよろしくお願いいたします。

  • 文字列の連結について教えて下さい。

    Ruby初心者です。 文字と数字を連携させて file1 file2 file3 . . file10 としたいのですが、 s = '100' for i in 1..10 name = 'file' + i + '\n' puts name end これだとエラーが出てしまいます。 どう修正したら良いのでしょうか?

    • ベストアンサー
    • Ruby
  • 文字列の動的確保とポインタ配列について

    C言語についての質問です。 現在、キーボードから文字列を読み込みファイルに保存するプログラムを作成しています。 プログラムの条件は、以下の通りです。 1: キーボードから英数字(最長でMAX_LEN(1000)-1文字)を入力して文字列(文字配列)dataに格納後、画面に表示する。 2: 入力された文字列と同じ長さの文字列を格納する領域を動的に確保し、文字列dataをその領域に コピーする。なお、必要な文字配列の長さは文字列の長さ+1バイトである。 3: 文字列endが入力されるか、入力された文字列がNUM_STRING(10)個になるまで1~2の処理を繰り返す 4: 各文字列へのポインタを格納する(char *)型ポインタの配列str_p(サイズ:NUM_STRING)を定義して利用する。 5:1~2の処理が終了した後で、メモリに格納されたすべての文字列をファイルに出力する。ファイル名はoutput.txtとし、最初の行に文字列の個数を、次の行以降に入力された順番と「逆の順番」で文字 列を出力すること。 実行例 input ->st22 st22 input->st1 st1 end ファイルの中身 2 st1 st22 現在完成しているプログラムは以下の通りです。 #include<stdio.h> #include<string.h> #include <stdilb.h> #define NUM_STRING 10 #define MAX_LEN 1000 int main (void) { int n, i; char data[MAX_LEN] = {}; char *str_p[NUM_STRING]; FILE *fp; do { printf("input->"); scanf("%s", data); if (strcmp(data, "end") == 0) { break; } else { printf("%s\n", data); n++ 2の処理 } while(n <= NUM_STRING); if ((fp = fopen("output.txt", "w")) == NULL) { fprintf(stdout, "File open error\n"); } fprintf(fp, "%d\n", n); for (i = n-1; i>0; i--) fprintf(fp, "5s\n", str_p[i]); fclose (fp); return 0; } 特に動的確保のところがよく分かりません。 回答よろしくお願いします。       

  • 文字列の比較について

    BufferedReaderでファイルを読んだのちに、見出しの文字列をカンマで分割して 文字列を比較しようとしています。 ですが、分割すると、文字列が別な文字コードによる表記に変わってしまいます。 なぜでしょうか? また、解決方法などのヒントなどあれば教えてください。 BufferedReader buffReader = new BufferedReader( new FileReader("/home/masa/Desktop/Sample.csv")); String s; int ini=0; int wamei=0; int i=0; while((s = buffReader.readLine())!= null){ String[] str = s.split(",", -1); //System.out.println(s); if (i == 0) { for(int j=0; j<str.length;j++){ System.out.println(String.toString(str)); if(str.equals("五十音")){ini = j;} System.out.println("五十音"+ini); if(str.equals("a")){wamei = j;} System.out.println("和名"+wamei); //System.out.println(j); } } i++;

    • ベストアンサー
    • Java
  • 文字列を比較

    文字列を比較して 一つでも一致したらファイルに書き込まず抜ける 一つも一致しなかった場合一度書き込んで抜けるという操作を 下記のコードで実現したいんですけど、 "cPid[n] = cStoRegiAdd; for(j = 0;j < MAX;j++){ if(cPid[n] != cRegiTab[j]){ iflag = 1; } } if(iflag == 1){ fprintf(fh,"#define %s 0\n",cStoRegiAdd); }" の部分で何かおかしいとこはありますか?? もしあれば教えていただきたいんですけど?? #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX 1024 char *cRegiTab[MAX]; // 文字列登録表 int n = 0; int main() { rightsidehfunction(); leftsidehfunction(); } /* 左辺の値をとって.hファイルに書き込む関数 */ int leftsidehfunction() { FILE *ft; FILE *fh; char buf[MAX]; char buf1[MAX]; char *cPid[MAX]; char *cWorkRegiAdd; char *cStoRegiAdd; int istr = 0; int k; char *p; char *q; int s; int i; int j; int iflag = 0; ft = fopen("test.txt","r"); fh = fopen("test.h","a+"); if (fh == NULL || ft == NULL) { printf("ファイルを開けません。\n"); return 1; } /* ファイルを1行ずつ読み込む処理 */ while (fgets(buf, sizeof buf, ft) != NULL){ cWorkRegiAdd = strtok(buf, "="); for(k = 0;k < n;k++){ if(*cPid[k] != *cWorkRegiAdd)continue; if(strcmp(cPid[k],cWorkRegiAdd) == 0)break; } if(k < n) continue; cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1); strcpy(cStoRegiAdd,cWorkRegiAdd); cPid[n] = cStoRegiAdd; for(j = 0;j < MAX;j++){ if(cPid[n] != cRegiTab[j]){ iflag = 1; } } if(iflag == 1){ fprintf(fh,"#define %s 0\n",cStoRegiAdd); } n++; } fclose(fh); fclose(ft); return 0; } /* 右辺の値をとって.hファイルに書き込む関数 */ int rightsidehfunction() { FILE *ft; // 入力ファイルポインタ FILE *fh; // 出力ファイルポインタ int c; //読み込み文字 char buf[MAX]; //バッファ領域 char buf1[MAX]; char cPid[MAX]; // 採取したPID char *cWorkRegiAdd; // 採取文字列作業域アドレス char *cStoRegiAdd; // 文字列格納域アドレス int iflag = 0; // 0/1; 右/左のクオート int ichs = 0; // chrの文字数 int istr = 0; // strの文字数 int k; // ntrの探索index int iOid; //OID char *p; ft = fopen("test.txt", "r"); fh = fopen("test.h", "w"); if (fh == NULL || ft == NULL) { printf("ファイルを開けません。\n"); return 1; } //ファイルを1文字ずつ読み込む while ((c = fgetc(ft)) != EOF) { switch (c) { case '"': iflag = 1 - iflag; /*右のクオート*/ if (iflag == 0) { cPid[ichs] = '\0'; cWorkRegiAdd = cPid; for(k = 0;k < istr;k++){ if(*cRegiTab[k] != *cWorkRegiAdd) continue; if(strcmp(cRegiTab[k],cWorkRegiAdd) == 0) break; } if(k == istr){ cStoRegiAdd = malloc(strlen(cWorkRegiAdd) + 1); strcpy(cStoRegiAdd,cWorkRegiAdd); cRegiTab[istr] = cStoRegiAdd; istr++; fprintf(fh, "#define %s 0\n", cStoRegiAdd); } ichs = 0; } break; case '\n': if (iflag == 1) { cPid[ichs] = '\0'; iflag = 0; } ichs = 0; break; default: if (iflag == 1) { cPid[ichs] = c; if (ichs < MAX - 1){ ichs++; } } break; } } /* ファイルの最後が改行じゃなかった場合 */ if (ichs>0) { cPid[ichs]='\0'; } fclose(ft); fclose(fh); return 0; }

  • ExcelVBAで初期値のセット

    ExcelVBAで初期値のセット Typeで定義したデータタイプの変数にConstで初期値をセットしたいのですがどのようにしたら良いのでしょうか。 例えば Public Const Sdata As String = "AAAAA" Public Const Idata As Long = 1 これはできますが、 Type typeA Sdata As String Idata As Long End Type Public Const Adata As typeA = "AAAAA",1 これはできません。 Typeで定義したデータ型にいるれ方法をお教えください。 ExcelVBA Type Const で検索してみましたが見つけきれませんでした。

専門家に質問してみよう