0

そのような問題があります。データベースから取得される 1 つのリストと、プログラム中に作成される 2 つ目のリストがあります。表は次のとおりです。

id name
One my foo1 foo2 foo3
2 my fow1 foo2 foo3
...

等々。プログラムの操作中に生成されるリストは、ファイルからデータを取得します。そして:

id name parent
...

問題は、データベース内にあるテーブルの列の親 ID 番号列がどこにあるかです。現時点では、決定を下しました:

int countMatch = 0;
foreach (var productse in prod)
{
    var splitted = productse.name.Replace("  ", " ").Split(' ');
    int maxmatch = splitted.Count(s => addProd.name.Contains(s));

    if (maxmatch > countMatch) countMatch = maxmatch;
}

var fixedCount = addProd.name.Split(' ').Count()/1.5;// 1.5 Choose the most best rate
if (countMatch <= fixedCount && prod.All(x => !x.name.ToUpper().Contains(addProd.name.ToUpper())))
  prod.Add(addProd); 

その「製品」リストがデータベースにロードされた後

このソリューションは機能しますが、あまりうまくいきません。一部の名前はより小さく最適なため、一部のレコードは作成されません。

読み込もうとしているサンプルデータ:

Intel Core i3-2120 3.3GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 OEM - name created

次のデータが取得されます id 親 (上記のエントリ) :

Intel Core i3-2120 3.3GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 OEM
Intel Core i3-2120 3.3GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 BOX w/cooler
Intel Core i3-2130 3.4GHz 3Mb 2xDDR3-1333 HDGraphics2000 TDP-65w LGA1155 OEM
Intel Core i3-3210 3.2GHz 3Mb 2xDDR3-1333 HDGraphics2500 TDP-55w LGA1155 OEM
Intel Core i3-3225 3.3GHz 3Mb 2xDDR3-1333 HDGraphics4000 TDP-55w LGA1155 OEM
Intel Core i3-3225 3.3GHz 3Mb 2xDDR3-1333 HDGraphics4000 TDP-55w LGA1155 BOX w/cooler
Intel Core i3-3240 3.4GHz 3Mb 2xDDR3-1333 HDGraphics2500 TDP-55w LGA1155 OEM
Intel Core i3-3240 3.4GHz 3Mb 2xDDR3-1333 HDGraphics2500 TDP-55w LGA1155 BOX w/cooler
Intel Core i5-2500K 3.3GHz (TB up to 3.7GHz) 6Mb 2xDDR3-1333 HDGraphics3000 TDP-95w LGA1155 OEM
Intel Core i5-3550 3.3GHz (TB up to 3.7GHz) 6Mb 2xDDR3-1333 HDGraphics2500 TDP-77w LGA1155 OEM
Intel Core i5-3550 3.3GHz (TB up to 3.7GHz) 6Mb 2xDDR3-1333 HDGraphics2500 TDP-77w LGA1155 BOX w/cooler

データをテーブルに入れる必要があり、データが最大数の一致に類似している場合は、親に到達します。ありがとうございました!

4

1 に答える 1

0

何をすべきかもっと明確に書いてもらえますか?私が理解しているように、テキストの始まりが同じである最も一般的な記号を特定することにより、テキストファイルからデータベースの行にリンクしたいと考えています。間違っている場合は修正してください。

最初は、テキスト処理の王様である正規表現を使用してみてください。行テキストにスペースを含む最後の単語を 1 つずつ反復して削除できます。

foreach (var fProduct in fileProducts)
{
    // remove blank spaces >= 2
    var fProductCleared = Regex.Replace(fProduct, @"\s{2,}", "");

    // search best match in data base
    bool isMatched = FunctionToMatchInDB(fProductClear); // search the whole text
    if(!isMatched)
    {
        // remove word by word from the end
        while(fProductClear.Contains(' '))
        {
             // remove last word with space from the end of line
             fProductClear = Regex.Replace(fProductClear,@"\s*[^\s]+\s*$", "");
             bool isMatched = FunctionToMatchInDB(fProductClear); 
             if(!isMatched)
                 break; // TODO: 
        }
    }

}
于 2013-04-04T04:57:50.457 に答える