ログファイルがあります。ファイルは構造化されています。各行は、テーブルのように見えるようにコンマで区切られています。このファイルから読み取り、コンテンツをデータベーステーブルに転送する必要があります。最初の9つのコンマを区切り文字として扱い、残りのコンマを10列目のコンテンツとして扱いたいと思います。したがって、1行に9つを超えるコンマを含めることができますが、10番目以降のコンマは区切り文字と見なされるべきではありません。私は実際に、文字を繰り返し処理し、コンマの出現をチェックすることによってそれを行う方法を知っています。しかし、私はそれが非効率的であることを望んでいません。多分もっと良い方法がありますか?これを達成するための最も正確な方法は何でしょうか?C#またはDelphiのどちらでも問題ありません。Oracleの場合、おそらくOracleを使用しますが、SQLServerもオプションです。
3 に答える
String.Split(char[],int)
メソッドのオーバーロードは、必要なものを実現します。例えば:
string line = "a,b,c,d,e,f,g,h,i,j,k,l,m,n";
string[] fields = line.Split(new char[] { ',' }, 10);
fields
配列には10個の要素が含まれます。最初の9つの要素は、文字でline
区切られた最初の9つの部分文字列に','
対応し、最後の要素は残りの部分文字列に対応します(9番目の','
出現に続く)。
MSDNから(メソッドcount
に渡される2番目の引数であるSplit(char[], int)
):
count
このインスタンスにサブストリングが複数ある場合、最初のcount
マイナス1サブストリングが戻り値の最初のcount
マイナス1要素に返され、このインスタンスの残りの文字が戻り値の最後の要素に返されます。
したがって、実行:
for (int i = 0; i < fields.Length; ++i)
Console.WriteLine(string.Format("fields[{0}]: \"{1}\"", i, fields[i]));
出力します:
fields[0]: "a"
fields[1]: "b"
fields[2]: "c"
fields[3]: "d"
fields[4]: "e"
fields[5]: "f"
fields[6]: "g"
fields[7]: "h"
fields[8]: "i"
fields[9]: "j,k,l,m,n"
一部のデータベースにはETL(抽出、変換、読み込み)機能があり、一度設定すると外部データを非常に迅速かつ効率的にインポートできます。それらがどれほど柔軟であるかはデータベースに依存します-あなたはどちらがそうであるかを言いませんでした。Delphiで列を識別するために、正規表現を使用します。とにかく、それらはあなたが行うのとまったく同じように実行します。文字列を繰り返し、文字を照合します。優れた正規表現ライブラリは高速(かつ柔軟)です。避けるべきことは、読み取られるファイルごとに1文字を読み取ることです。n行をメモリバッファに読み込み、そこで処理します。
FileHelpersライブラリとそのDatabaseStorageクラスを使用してみてください。