文字列重複チェックとリネーム処理の方法

このQ&Aのポイント
  • 文字列の重複をチェックしてリネームする処理について解説します。構造体を配列化している場合、同じ名前が存在するか確認し、存在した場合は末尾に数字を付けてリネームします。
  • また、リネームする際には文字列の長さも考慮し、最大10バイトに制限します。もしリネーム後の文字列が10バイトを超える場合は数字の部分を削ります。
  • ループを使用して名前の存在確認とリネーム処理を行いますが、名前が変更されたら再度最初から確認する必要があるため、適切なループ処理を行う必要があります。サンプルコードを交えながら解説します。
回答を見る
  • ベストアンサー

文字列の重複をチェックしてリネームしたい。

構造体を配列化していて、そこに名前を入れる処理を作っています。 その際、同じ名前がないか確認して、存在した場合、末尾に数字をふって いきたいのです。 例えば、「名前」と入れたいのに、既に名前があったら「名前1」に。 もし「名前1」もあれば、「名前2」にといった具合です。 この名前についても、最大10バイトにしたいので、もし10バイトを 超えるようなら、数字のぶんを入力したい名前から削りたいと思っています。 例えば、「テスト1」としたいが、最大が6バイトだったならば、「テス1」と したいです。 悩んでいるのが、まず名前が存在するかループした後、その変更した名前で 再度チェックする処理と、採番の処理です。 for文だけだと難しそうなのですが、どのループでいけば実現可能なのか わからず苦慮しています。 名前を変更したらまた最初からなめるというものなので、やるべきことは 明確なんですが…。 出来ましたら、サンプル交えてご教授いただけないでしょうか? 宜しくお願いします。

  • ginfix
  • お礼率34% (330/962)

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

Function Check(Data() As xxx) As String '←重複した名前を返す Sub Modify(Data() As xxx, Name As String) '←指定された名前を変更 Sub Proc(Data() As xxx) '処理本体   String Name   Do '無限ループ     Name = Check(Data)     If Name = "" Then Exit Do '重複が無ければループ終了     Modify(Data, Name)   Loop End Sub こんな感じでしょうか・・・

関連するQ&A

  • 文字列の検索と比較

    文字列の検索と比較 以下の手順に従ってプログラムを作成せよ.適宜printf を利用して,入力支援(「文字列を入 力して下さい」などの画面表示)を行うこと. (1) 文字配列name[5][64] を作成する. (2) キーボードから5 人分の名前を入力し,name 配列に格納する. (3) キーボードから名前を入力し,name 配列の何番目に格納されているかを検索して表示 する.ただし,見つからなかった場合には,「見つかりません」と表示する. (4) 「quit」が入力されるまで(3)の処理を繰り返す. という処理です・・・・・。 #include <stdio.h> int main(void){ char name[5][36]; int i; for(i = 0; i < 5; i++ ){ printf("%d番目の名前を入力:", i + 1); scanf("%s", name[i] ); } printf("五人の名前を入力しました。\n"); printf("どこに格納されているか検索します。名前を入力:"); scanf("%s",name); /* ここに配列の何番目に格納されているかを検索して表示するプログラムを作成する ただし,見つからなかった場合には,「見つかりません」と表示する. 「quit」が入力されるまで処理を繰り返す処理を書く?? */ getchar(); getchar(); return(0); } 検索された文字と入力された文字が同じであることの処理はどうすればいいのでしょうか? 二つの配列を用意してループ文?でしょうか?

  • C言語の配列にPushするには

    Perlのpushのように あるループ内の配列にたいして任意の文字列を配列の末尾に入れることは可能なのでしょうか。 ヒープやを使えば文字列がどんな長さでも対応できるということまでは理解できたのですが どのようなソースの書き方をすれば良いのか判りません。 出来ましたら簡単なサンプルソースを教えいただけませんでしょうか。

  • 配列変数に重複のないランダムな数字を入れて行くには?

    JavaScript初心者です。 配列にランダムな数字を入れたいのですが、 aRnd = new Array(); aRnd[0] = Math.floor(Math.random()*100); aRnd[1] = Math.floor(Math.random()*100); aRnd[2] = Math.floor(Math.random()*100); のようにやると各配列にはランダムな数字が入りますが、重複が発生する可能性があります。これを重複が発生しないようにしたいのですが、どのようにすればいいのでしょうか? なお、上記例では0~99までの数字を3つの配列にセットする方法となっていますが、配列数や数字の最大値は変更する可能性があるので、これも配慮したいと思います。 よろしくお願いいたします。

  • 【継続質問】シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入

    シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入 の継続質問です。よろしくお願いします。 tacとawkを用いて、"ある特定の文字列の前に文字列を挿入"ということができるのは、 確認することができました。 例えば、  script.awk (awkスクリプト)  sample.txt (処理対象ファイル) という環境で、  $ cat script.awk  $ tac sample.txt | awk -f script.awk | tac > sample2.txt とコマンドを入力した場合、 sample2.txtに、処理が完了したテキストが作成され、 中身も問題ないことを確認できました。 しかし以下のようなことを実現しようと思うと、 うまく行きませんでした・ 「非対話的に上記の処理を行いたいのです」 上記の方法では、 catとtacと2回コマンドを叩く必要があります (1回にもできるのでしょうが…) できれば、自動的に流れる膨大なシェルスクリプトの処理の中で、 上記の処理を自動的に行うということを実現したいのです。 例えば、auto.shというシェルを実行すれば、 勝手にawkスクリプトを読み込み、勝手に変換したものを出力してくれる… そのようなシェルを作成したいと考えています。 そこで色々試しましたが上手くいきません。 1.コマンドの分解ができない tac sample.txt | awk -f script.awk | tac > sample2.txt の上記を、  #!/bin/sh  tac sample.txt  awk -f script.awk  tac > sample2.txt のようにシェルスクリプトに記述しなおして実行しましたが、 上手くいきませんでした。 2.script.awk(awkスクリプト)を内部に取り込み 外部ファイルとして存在している、script.awkをなんとか シェルに組み込もうと思って、  awk {(script.awkの内容をそのまま記述)} のように行いましたが、文法的にやはり無茶苦茶でした・・・。 正直、2番が無理であれば仕方ありませんが、 最低でも1は実現したいと思います。 1の方法だけでも良いので、どなたか回答をお願いします。

  • PHPのループ数限界値について

    PHPのループ数限界値について 宜しくお願い致します。PHP 5.1.6を使用しております。 PHPのforやwhileのループ処理について、限界のループ数というのは存在するのでしょうか? 今作っているプログラムで、約15,000項目の配列と約10,000項目の配列で2重のループ処理しています。 この場合のループ数は15,000×10,000=150,000,000回の繰り返し回数となってしまいます。 しかも、この配列数は今後も増える可能性が高いです。 ループの限界値が何回なのか、教えてください。

    • ベストアンサー
    • PHP
  • UNIXコマンドで連番付ファイルのリネームについて

    いつもOKWaveでお世話になっております。 表題の件ですが、 UNIXのsplitコマンドで分割したファイルに拡張子を付けたく コマンドライン上で分割されたファイルを同時にリネームする方法を探しております ファイル分割 % split -a 3 -d -l 100 sample.txt sample_ ※100行単位で分割ファイルを3桁の数字で連番を付けています 処理結果 sample_000 sample_001 sample_002 sample_003 ・ ・ ・ 上記ファイルに「.txt」を付けたいと考えております 例) sample_000.txt sample_001.txt sample_002.txt sample_003.txt ・ ・ ・ 書き方の問題かと思うのですが、 renameコマンドを使いファイル名を変更しようとするも変化なしとなります % rename sample_* sample_*.txt sample_* 最終的にはコマンドをパイプで繋いで 分割からリネームまで1本の処理で完結したいと考えております。 恐れ入りますが、ご教示のほどよろしくお願いいたします。

  • 自動でリネームするバチファイルの作り方

    ファイル名の変更を自動で行うバッチファイルを作りたいのでですがどなたかお知恵を貸してください。 ・あるネットワーク上のフォルダには随時ファイルが書き込まれます。 ・そのフォルダを監視し、追加された事を検知するとバッチファイルを自動的に実行します。  (この処理はフリーソフトで実現できるようです) バッチファイルで実現したい事はその追加されたファイルの名前の先頭部分(固定長)を切り取る事です。 ファイル名のフォーマット xxxxxxxxxxxx-yymmdd-hhmmss.txt 上記のファイル名の先頭のxxxの部分をハイフンまで切り取りたいのです。 先頭部分を切り取ってもファイル名が重複する事はありません。 元のファイル名の書式を変更する手段はないので書き込まれた後で変更するしかありません。 つまり、フォルダ上にあるファイルの名前の長さを判定し、規定値を超えていたら切り取り(リネーム)をするという事です。 一度にいくつのファイルが書き込まれるかは分かりませんので該当するファイルがある限り処理をする必要があります。

  • 配列をループでたくさん宣言したいのですが、配列名や変数名を変数で宣言することはできませんか?

    お世話になっております。 タイトル通りの質問です。 日付がファイル名になっているCSVファイルが複数あるのですが、 それをそのまま「array20071020」などという名前の配列に、それぞれ入れて行きたいと思います。ループ処理でなければ出来ないと思うのですが、ループ処理内で配列を宣言していく方法はあるでしょうか。

  • CSV ⇒ 構造体 ⇒ 文字列配列

    1,あいうえおあいうえお 3,かきくけこ 2,さしすせそさしすせそさしすせそ 3,たちつてと 2,なにぬねの 1,はひふへほはひふへほはひふへほはひふへほ    ・    ・    ・ といったようなCSVファイルがあります。 まずは、それを typedef struct tagSetInf{  int nPattern; // 1or2or3  char szSearch[256]; // 文字列:最大255バイト }SetInf; という構造体に格納していき、そのszSearchの値を nPatternの値に応じて3種類の文字列配列((例)search1,search2,search3)に 格納したいと思っています。 CSVのレコード数は可変です。(たぶん最大数は100くらいだとは思うのですが・・・) 以上の実現方法を教えてください。よろしくお願いいたします。 環境:Win32 API、C/C++。

  • スリザーリンクの問題をランダムに生成するプログラム

    題名のようなプログラムをC言語で書きたいと思います。 日本語としておかしいところがあったらすいません。 方針としては下図のような時計回りの矢印ブロックをつくり  → ↑ ↓  ← 矢印の元を-1、1矢印の先を1としてつながったところが足して0になってループと判定し、これをどんどんつなげていって最終的に大きなループを作ろうと考えています。 スリザーリンクの問題として入り組んだループが生成されるように、二度目選択したときにはループを削除して凹凸やへこんだループを実現して、そのあと点対称、線対称にヒントとなる数字を書き入れていきたいと思います。 まず選択したマスを格納する配列と、矢印の向き(-1,1の情報)を格納する配列、ヒントの数字を格納する配列を用意してランダムに矢印のブロックを生成するプログラムを書いたのですが、凹凸やへこんだループのためのループ削除で複数のループができるようになってしまいました。 これを回避する条件など問題は山積みですが。 他にもっと良い方法やこうしたほうがいいよといったロジックなどあればご教示お願いします。