-1

インターネットから2つのファイルをすぐに取得し、それらをチェックして3番目のファイルを作成するアプリを作成しています。つかむ部分が終わったので、今は2つのファイルがあります。

最初のファイルは、次のようなテキストを含む.txtファイルです。

Order Code|Stock
ACREPAIR|1031
AF813|18
AF823|12
AFCOB11|21
AFCS300|33
AFCS3000|1
AFEM4|5
AFOMNI|17
AFOX2|-3
AFOX3|-3
AFROD|28
AFSENSOR|50
AFUF21|24
AN00001|-1
AN00002|21
AN00003|4
AN00004|4
AN00005|9
...

このファイルのすべての行のテキストは、特定のアイテムのコードとアイテムの在庫(現在利用可能な製品の数)です。そのような行は何十万もあります

次に、これも.txtであり、次のようにフォーマットされた別のファイルがあります。

Action,CategoryPath,ID,Name,Code,Stock
"Product","Home > Opto-electronics > LED > Standard LED, Multicolour",2226,"KINGBRIGHT LED, 3MM, HE-RED/GRN L-93WEGW","SC07621",202
"Product","Home > Resistors > Fixed",2228,"VISHAY DRALORIC RESISTOR, 0402, 5%, 10K0 CRCW040210K0JNEAIF","RE06211",0
"Product","Home > Resistors > Fixed",2229,"VISHAY DRALORIC RESISTOR, 0402, 5%, 3R90 CRCW04023R90JNEAIF","RE06212",0
"Product","Home > Resistors > Fixed",2230,"VISHAY DRALORIC RESISTOR, 0402, 5%, 2R70 CRCW04022R70JNEAIF","RE06220",25
"Product","Home > Resistors > Fixed",2231,"VISHAY DRALORIC RESISTOR, 0402, 5%, 33R0 CRCW040233R0JNEAIF","RE06221",0
"Product","Home > Resistors > Fixed",2232,"VISHAY DRALORIC RESISTOR, 0402, 5%, 100R CRCW0402100RJNEAIF","RE06226",0
"Product","Home > IC's > Comparators",2234,"STMICROELECTRONICS IC, COMPARATOR DUAL, DIP8, 393 LM393N","SC10207",57
"Product","Home > IC's > Amplifiers > Operational",2237,"STMICROELECTRONICS OP AMP, QUAD JFET, DIP14 TL084CN","SC07929",82
"Product","Home > IC's > Amplifiers > Audio Power",2239,"NATIONAL SEMICONDUCTOR AMP, AUDIO 0.25W, DIP8, 386 LM386N-1","SC08430",83
"Product","Home > IC's > Microcontrollers",2241,"MICROCHIP 8BIT FLASH MCU, 12F675, DIP8 PIC12F675-I/P","ACREPAIR",16
...

そして、ここに私の問題があります。アプリケーションで最初のファイルから行を取得し、コードとストックを別々に取得してから、2番目のファイルで一致するコードを見つけて、ストック値を比較する必要があります。2番目のファイルで同じでない場合、在庫は最初のファイルの在庫の値に置き換えられます。ただし、値が同じである場合は、2番目のファイルのコードと同じ値の在庫を含む行を削除する必要があります(何も置き換えないでください)。

説明が必要な部分:

  1. コード例で構成されるカップル変数を取得して最初のファイルを読み取る方法。ACREPAIRと在庫例 1031

  2. 次のようなコードを含む2番目のファイルの行を見つける方法:"Product"、 "Home> IC's> Microcontrollers"、2241、 "MICROCHIP 8BIT FLASH MCU、12F675、DIP8 PIC12F675-I / P"、 " ACREPAIR " 、16およびその16は1031に置き換えられるか、値が同じである場合、その行は2番目のファイルから削除されます。

私はそれを行う方法についての提案やスニペットさえも非常にありがたいです。

4

3 に答える 3

3

これが始めるのに役立つことを願っています。呼び出しは、ファイルのSkipヘッダー行をスキップするために行われます。このコードはさまざまな方法で最適化できることに注意してください(のHashSet代わりに配列を使用しcompareToたり、分割インデックスのハードコーディングを回避したりするなど)が、それを行うのはあなたの責任だと思います。

var items = File.ReadAllLines("file1.txt").
    Skip(1).
    Select(s =>
    {
        var strings = s.Split('|');
        if (strings.Length != 2) throw new FormatException();
        return new {Code = strings[0], Stock = Convert.ToInt32(strings[1])};
    }).
    ToArray();
var compareTo = File.ReadAllLines("file2.txt").
    Skip(1).
    Select(s =>
    {
        var strings = s.Split(',');
        if (strings.Length != 6) throw new FormatException();
        return new {Code = strings[4].Trim('"'), Stock = Convert.ToInt32(strings[5])};
    }).
    ToArray();
//You can use Intersect after having defined your EqualityComparer, 
//avoid anonymous types in your final code
foreach (var item in items.Where(i => compareTo.Any(i2 => i.Code == i2.Code)))
{
    //Operate, be aware that compareTo is dissociated from your original file
    //So you'll have to adapt the above approach for your needs.
}
于 2013-01-02T02:37:05.403 に答える
1

あなたのC#スキルがどのようなものかわからないので、ロードマップを示します。

両方のファイルは一見非常に異なっているように見えますが、よく見ると、構造的に非常に似ていることがわかります。両方のファイルは「カンマ区切り」です。唯一の違いは、セパレータ(|に対して,)と列の数です。つまり、2番目のファイルには不要な列があります。

したがって、可能なアルゴリズムは次のようになります。

  1. 最初のファイルをメモリに読み込み、を使用string.Split()して各行の名前と値のペアを取得します。

  2. 2番目のファイルもメモリに読み込み(ファイルがそのために大きすぎないことを願っています)、string.Split()実際には必要のないものも含めて、すべての列の値を取得するためにも使用します。(6)でファイル全体を書き込むために必要です。

  3. 両方のファイルのファイルハンドルを閉じてください!これは、(6)で上書きする場合に重要です。

  4. 2番目のファイルの行を繰り返し、各行について、最初のファイルの行で同等のエントリを検索します。

  5. これで、値を比較して、必要な操作を実行できます(2番目のファイルの値を変更したり、行全体を削除したりするなど)。比較/変更するときは、ファイル2の引用符に注意してください。

  6. ファイル2の書き込みハンドルを開き、ファイルを上書きして、ファイル2の行の(変更された!)リストを適切な形式で新しいファイルに出力します。CSVのような形式を生成するには、を使用できますstring.Join()

于 2013-01-02T03:21:29.117 に答える
0

Txtファイルのawalysに製品コードと在庫数が最後に含まれていると仮定すると、これでうまくいくはずです。

テキストファイルが大きい場合、これはおそらくかなり遅くなりますが、必要に応じてリファクタリングすることができますが、これは良い出発点になるはずです。

List<string[]> stock = new List<string[]>(File.ReadAllLines("G:\\Stock.txt").Select(line => line.Split('|')));
List<string[]> products = new List<string[]>(File.ReadAllLines("G:\\Products.txt").Select(line => line.Split(',')));

products.ForEach(p =>
{
    // since not all arrays in this case are the same lenght, we will go backwards from the end
    int productStockIndex = Array.IndexOf(p, p.Last());

    // product name is before the stock count
    int productNameIndex = productStockIndex - 1;

    // get product name to find in Stock.txt and remove extra quotes from product name
    string productName = p[productNameIndex].Replace("\"", "");

    // check if Stock.txt contains the product
    if (stock.Any(s => s[0] == productName))
    {
        // Update the stock count
        p[productStockIndex] = stock.First(stk => stk[0] == productName)[1];
    }       
});

ファイルを保存....

于 2013-01-02T02:53:06.563 に答える