Replaceの使い方

UiPath初心者です。
データテーブルの列の中にある文字列を

yamamoto → 山本
tanaka → 田中
sato → 佐藤

と、複数の条件で置換させたいです。

このような場合、どのように書けば良いでしょうか。

基本に忠実に、

Row.Item(“名前”).ToString.Replace(“yamamoto”,“山本”)

ですね。

多分大量に置換する組み合わせがあるでしょうから、

「繰り返し(各行)」アクティビティの下に、「繰り返し(各行)」アクティビティを配置して、対象とするDataTableの行をRowからRow1にし、置換するパタンのDataTableの行をRow2とし、

Row1.Item(“名前”).ToString.Replace(Row2.Item(“検索”).ToString, Row2.Item(“置換”).ToString)

ってな具合にできますね。

置換する際は、文字列の長さを降順にする必要がありますよ。

SAITOを、ITOから置換してしまう場合がありますから。。。

ITO⇒伊藤
SAITO⇒SA伊藤

気を付けて!

二重の繰り返しになりますね

ありがとうございます。

この部分なのですが、
置換するパターンで別のdatatableを作っておき、datatableの中の置換したい行のことでしょうか。

1 Like

こんなことが起こるのですね。
ビックリです!!!

そうですね。例にあった3パタンでは足りないでしょうから(^^♪

それでは、
①変えたい一覧のExcelを作る
②範囲の読み込みでdatatableにする。(dt)
③繰り返し各行 (この時コレクションの要素として選ぶのは、②ではなく、置換させる リスト ですよね???)

と、ここで、どこでdt を指定してあげればよいのか、分からなくなりました。

Row1.Item(“名前”).ToString.Replace(Row2.Item(“検索”).ToString, Row2.Item(“置換”).ToString)

また、ここのRow1 はdatatable名ではなく、そのままRow1 の表記であってますか?
Row2も同様に。。ですか?

Row1,Row2は、各DataTableの行を指します

置換対象とするDataTableをDT1とし、変えたい一覧のDataTableをDT2とすると、

繰り返し(各行)アクティビティで
次のコレクション内の各要素にDT1
繰り返しにRow1
を指定します。

この繰り返しアクティビティの本文の中に、
さらに、繰り返し(各行)アクティビティを配置し、
次のコレクション内の各要素にDT2
繰り返しにRow2
を指定します。

*二重の繰り返しになりますね。

その本文に代入アクティビティを配置して、
左辺:[DT1の]Row1.Item(“名前”)
右辺:[DT1の]Row1.Item(“名前”).ToString.Replace([DT2の]Row2.Item(“検索”).ToString, [DT2の]Row2.Item(“置換”).ToString)

ですね([DT1の]は説明のために入れています)。

1 Like

ご丁寧に説明頂き本当にありがとうございます。
良く分かりました。
早速作ってみます!
本当にありがとうございます。

1 Like

こんにちは

そもそもになりますが
各列に格納されている文字列はyamamoto やtanakaといった英文字だけでしょうか?
それとも前後になんらかの文字がつくケースがあるのでしょうか?

前者の場合は、Replaceメソッドを使う必要はなく、Dictionaryを用意してそれに基づき
変換するだけになります。

後者の場合は、正規表現で必要な文字列だけを取り出して、それをDictionaryで変換
した方が、データにもよりますが、パフォーマンスは良いように思えます。以下例です。

サンプル添付しますので、ご参考まで(Main.xamlが前者、Sequence.xamlが後者です。
実際にはDictionaryに該当キーが無い場合の処理を入れる必要があります。)

Sample20210121-2.zip (4.6 KB)

1 Like

アドバイス頂き、ありがとうございます。
また、サンプルまで作って頂きありがとうございます。

お察しの通り、
英文字以外に
空白
/
,

(大なりのかっこ)
を含んでおりました。
これらのものは、英文字の間に入っております。

教えて頂いたサンプルを元に今から作ってみます。

ここの部分についてですが、該当キーが無い場合は、取り合えず、そのまま英文字を活かそうと思っております。
この場合、どのようにすれば良いでしょうか。

こんにちは

英文字の間に入っております。

名前を表す英文字の中間にあるという意味でしょうか?
具体例があると良いかもしれません。

Sequence.xamlの方のループ内の式を以下に書き換えてみてください。

row("name") = System.Text.RegularExpressions.Regex.Replace(row("name").ToString,"(?<=^|[^A-Za-z]+)[A-Za-z]+(?=[^A-Za-z]+|$)",Function(m) if(dictName.ContainsKey(m.Value),dictName(m.Value),m.Value),System.Text.RegularExpressions.RegexOptions.None)

Sample20210121-2-2.zip (4.6 KB)

おはようございます。
朝早くからすみません。
本当にありがとうございます。

名前のファイルを添付します。
式につきましても、本当にありがとうございます。
sample.xlsx (11.0 KB)

こんにちは

ありがとうございます。

置換対象側の表の当該列の内容はどのようになっていますでしょうか?
上記名前変換表の文字列がそのままでしょうか?それともそれ以外の文字が含まれるのでしょうか?
それによってアプローチが異なります。

ありがとうございます。

置換対象側の表なのですが、
基本的には文字列がそのままなのですが、
まれに新しい名前が出てくることがあります。
(特定機種の2次外注先を記載しているため、
取引先変更で、新しい名前が発生することがあります。)
その際は、英文字をそのまま残そうと思っております。
この様な内容で伝わりますでしょうか。

こんにちは

そのままであれば、Replaceメソッドは不要になるかと思います。

Sample20210121-2-3.zip (9.0 KB)

上記にはsample.xlsxは同梱しておりませんので、コピーしてください。

1 Like

本当に何から何までありがとうございます。
早速配置します!

何度もすみません。
ここの部分は、どうなりますでしょうか。

Sequence.xamlの方のループ内の式を以下に書き換えてみてください。

row("name") = System.Text.RegularExpressions.Regex.Replace(row("name").ToString,"(?<=^|[^A-Za-z]+)[A-Za-z]+(?=[^A-Za-z]+|$)",Function(m) if(dictName.ContainsKey(m.Value),dictName(m.Value),m.Value),System.Text.RegularExpressions.RegexOptions.None)

[/quote]

こんにちは

これは無視してもらって問題ありません。

一番最後に添付したzipがすべてになると思います。

1 Like