4

特定のアプリケーションからの出力として、以下のような約 5k 以上の文字列の配列があります (セキュリティ上の理由から、正確なデータを提供できない場合がありますが、例の形式は実際のデータとほとんど同じです)。

kasdfhkasdhfaskdfj42345sdsadkfdkfhasdf5345534askfhsad
asdfasdf66sdafsdfsdf4560sdfasdfasdf
sdfaasdfs96sadfasdf65459asdfasdf
sadfasdf8asdfasdas06666654asdfasdfsd
fasdjfsdjfhgasdf6456sadfasdfasdf9sdfasdfsadf

簡単に言えば、 5つの部分で構成される非改行英数字文字列があります。

[latin letters][1 or more digits][latin letters][1 or more digits][latin letters]

文字部分の長さと桁数はランダムで、文字列全体の長さは文字から 2 ~ 3文字までさまざまですが、パターンは上記のとおりです。

実際には、先頭と末尾の文字列部分に興味があります。つまり、[1 or more digits][latin letters][1 or more digits]単に破棄される可能性がありますが、セルを分離するために他の 2 つの文字列を抽出する必要があります。

試しSUBSTITUTEてみSEARCHましたが、まだランダムな桁数を処理できない場合があります。VBA は最後の望ましいアプローチですが、純粋な数式が役に立たない場合は許容されます。さらに、ソリューションは、同様のパターンで将来的に使用できるように柔軟である必要があります。そのため、適切なガイダンス/一般的なアプローチは高く評価されます。

4

3 に答える 3

4

Excel の代わりにMS Wordを使用してもかまわない場合は、ワイルドカードSearch and Replaceを使用した組み込みルーチンを使用する、非常に簡単な方法があります。データが Word で開かれる可能性があると仮定して、次の手順を実行します。

  1. CTRL+を押しHて置換ダイアログを開きます。
  2. オプションにチェックを入れUse wildcardsます。
  3. 破棄したいデータの部分は、次のパターンに一致します。[0-9]{1,}*[0-9]{1,}- これは、任意の数字が 1 回以上、その間に任意の文字があることを意味します。;地域の設定によっては、ここの代わりに必要になり,ます。
  4. 任意の文字を置換として指定します。たとえば、^t(Tab) または;- をさらにパーツ分割する場合に使用します。
  5. 交換を行ってください。
  6. 必要に応じて、リボン機能を使用して残りをテーブルに変換できますInsert > Table > Convert Text to Table...

あとは、得られた結果を保存/貼り付けするだけです。

実際、このアプローチは非常に強力であり、多くの日常的なテキスト データ解析タスクは、特別なスキルやプログラミングがなくてもすぐに実行できます。また、これにはサードパーティのツールは必要ありません。現在、すべての PC に Word がインストールされています。

パターンと該当するケースについて詳しく読む:

于 2013-02-14T18:04:04.827 に答える
2

偉大なchandooのこのチュートリアルに基づいています(Excelで素晴らしいものになりたい場合は、誰に従うべきですか:

この数式を使用して (配列数式に注意してください。ENTER+SHIFT+CTRLで入力する必要があります)、抽出します

{=MIN(IFERROR(FIND(lstNumbers,G6),""))}

ここで、lstNumbers は、0 ~ 9 (セル内の各数値) を含むセルを含むシート内の名前付き範囲であり、e1 はデータを含むセルです。

これにより最初の数値が返され、次のようにして最初のセクションを抽出できます。

=LEFT(E1,G1-1)

ここで、e1 にはデータが含まれ、g1 には前の式が含まれます

使用する数値セクションの末尾を取得するには:

{=MAX(IFERROR(FIND(lstNumbers,E1),""))}

次に、mid を使用して数値セクションを抽出し、len(datacell)-len(max 関数から) を使用して、残りの文字列を右 (または mid) で抽出できます。同じ処理を使用します。最初の数値を min で取得し、最後の数値を max で取得するなどです。

幸運を!これは本当に難しいです。実際のプログラミング言語でこれを行う方がおそらく簡単でしょう

于 2013-02-14T17:47:46.050 に答える
2

更新しました:

この配列数式は、最初の文字列部分を提供します。

  =LEFT(A1,MATCH(0,1*ISERROR(1*MID(A1,ROW(INDIRECT("$A1:$A"&LEN(A1))),1)),0)-1)

この配列数式は、最後の文字列部分を提供します。

  =RIGHT(A1,MATCH(0,1*ISERROR(1*MID(A1,LEN(A1)+1-ROW(INDIRECT("$A1:$A"&LEN(A1))),1)),0)-1)
于 2013-02-14T18:35:57.690 に答える