0

私はこれまでにそのようなコードを持っています:

private void button3_Click(object sender, EventArgs e)
{
    label1.Visible = true;
    label2.Visible = true;
    var items = File.ReadAllLines("updated database folder/Resellers_Inventory.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("old database folder/ProductAll.txt").
                Skip(1).
                Select(s =>
                {
                    var strings = s.Split(',');
                    if (strings.Length != 6) throw new FormatException();
                    return new { Path = strings[2].Trim('"'), Id = Convert.ToInt32(strings[3]), Name = strings[4].Trim('"'), Code = strings[5].Trim('"'), Stock = Convert.ToInt32(strings[6]) };
                }).
                ToArray();

    string foldername = DateTime.Now.ToString("yyyy--MM--dd");
    Directory.CreateDirectory("Update file of " + foldername);
    string UpdeitoFailas = @"Update file of " + foldername + "/update.txt";

    foreach (var item in items.Where(i => compareTo.Any(i2 => i.Code == i2.Code)))
    {
        if ((File.Exists(UpdeitoFailas)) && i.Stock != i2.Stock)
        {
            using (StreamWriter sw = new StreamWriter(UpdeitoFailas))
            {
                sw.Write("Product, " + i2.Path + ", " + i2.Id + ", " + i2.Name + ", " + i2.Code + ", " + i.Stock);
             }
         }
     }

ファイル「Resellers_Inventory.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
...

ProductAll.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
...

基本的に私がやりたいのは、ProductAll.txtのように見えるが、そのように異なる3番目のファイルを作成することです。Resellers_Inventory.txtの在庫がProductAll.txtと異なる場合は、update.txtに次のような行を記述します。 ProductAll.txtの行と同じですが、Resellers_Inventory.txtの在庫値があります。株価が同じ場合は、この行をスキップして、新しい3番目のファイルに書き込みません。マッチングライン(在庫)は、両方のファイルで同じアイテムコードをマッチングすることによって実装されます。

現時点では、このようなエラーが発生しています。

Error   1   The name 'i' does not exist in the current context  C:\Users\Tutis\Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 90  53  WindowsFormsApplication1
Error   2   The name 'i2' does not exist in the current context C:\Users\Tutis\Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 90  64  WindowsFormsApplication1
Error   3   The name 'i2' does not exist in the current context C:\Users\Tutis\Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 94  48  WindowsFormsApplication1
Error   4   The name 'i2' does not exist in the current context C:\Users\Tutis\Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 94  65  WindowsFormsApplication1
Error   5   The name 'i2' does not exist in the current context C:\Users\Tutis\Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 94  80  WindowsFormsApplication1
Error   6   The name 'i2' does not exist in the current context C:\Users\Tutis\Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 94  97  WindowsFormsApplication1
Error   7   The name 'i' does not exist in the current context  C:\Users\Tutis\Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 94  114 WindowsFormsApplication1

しかし、これがなくても、新しいupdate.txtファイルシンボルに書き込む方法がわかりません。その行は、他の株価だけでProductAll.txtと同じように見えます。

4

2 に答える 2

0

コードで何が起こっているかを確認するのは少し難しいですがFile.WriteAllLines、結果ファイルを作成するために使用できます。

昨日の質問の回答を使用して、投稿した例が機能しないため、機能していることを示しています。

    private void UpdateProducts()
    {
        ThreadPool.QueueUserWorkItem((o) =>
        {
            DateTime start = DateTime.Now;
            List<string> updatedProducts = new List<string>();
            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"));
            updatedProducts.Add(products[0]);
            SetProgress(products.Count);
            foreach (var item in products)
            {
                if (stock.Any(s => item.Contains(s[0]) && !item.EndsWith(s[1])))
                {
                    string[] p = item.Split(',');
                    int productStockIndex = Array.IndexOf(p, p.Last());
                    int productNameIndex = productStockIndex - 1;
                    string productName = p[productNameIndex].Replace("\"", "");
                    p[productStockIndex] = stock.First(stk => stk[0] == productName)[1];
                    updatedProducts.Add(string.Join(",", p));
                }
                UpdateProgress(updatedProducts.Count);
            }
            File.WriteAllLines(@"G:\Results.txt", updatedProducts.ToArray());
        });
    }

    private void SetProgress(int maxValue)
    {
        base.Invoke((Action)delegate 
        {
            progressBar1.Maximum = maxValue;
        });
    }

    private void UpdateProgress(int value)
    {
        base.Invoke((Action)delegate
        {
            progressBar1.Value = value;
        });
    }

    private void button1_Click(object sender, EventArgs e)
    {
        UpdateProducts();
    }

幸運を :)

于 2013-01-03T01:05:58.763 に答える
0

「ProductAll.txt」にあるデータでは機能しないようです

CSVの行を区切り文字としてコンマを使用して分割する必要がありますが、コンマは二重引用符で囲んでください。

String.Split()は、そのジョブには適していません。車輪の再発明を試みる代わりに、この無料のライブラリを使用してCSVファイルを読み取ることができます。

それを使用するためにあなたがする必要がある唯一のことは、LumenWorks.Framework.IO.dllへの参照を追加することです

これは、「高速CSVリーダー」ライブラリと辞書を使用してコードフィールドでの検索を高速化するためのサンプルコンソールプロジェクトです。

using LumenWorks.Framework.IO.Csv;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace TestProgram
{
    class Product
    {
        public string Action { get; set; }
        public string CategoryPath { get; set; }
        public int ID { get; set; }
        public string Name { get; set; }
        public string Code { get; set; }
        public int Stock { get; set; }
    }

    static class Extensions
    {
        public static string DoubleQuoteString(this string str)
        {
            return '"' + str + '"';
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var resellersInventoryQuery = from lineTokens in ReadCsvLines("data\\Resellers_Inventory.txt", true, '|')
                                          select new { Code = lineTokens[0], Stock = Convert.ToInt32(lineTokens[1]) };

            Dictionary<string, int> orderStock = resellersInventoryQuery.ToDictionary(kvp => kvp.Code, kvp => kvp.Stock);

            var allProductsQuery = from lineTokens in ReadCsvLines("data\\ProductAll.txt", true, ',')
                                   let product = ParseProduct(lineTokens)
                                   select product;

            using (StreamWriter sw = File.CreateText("data\\updated.txt"))
            {
                foreach (var product in allProductsQuery)
                {
                    if (orderStock.ContainsKey(product.Code))
                    {
                        int newStockValue = orderStock[product.Code];
                        if (newStockValue != product.Stock)
                        {
                            product.Stock = orderStock[product.Code];
                            sw.WriteLine(ToString(product));
                        }
                    }
                }
            }

        }

        static IEnumerable<string[]> ReadCsvLines(string file, bool hasHeader, char delimiter)
        {
            using (CsvReader csr = new CsvReader(new StreamReader(file), hasHeader, delimiter))
            {
                int fieldCount = csr.FieldCount;
                while (csr.ReadNextRecord())
                {
                    List<string> lineTokens = new List<string>();
                    for (int i = 0; i < fieldCount; i++)
                        lineTokens.Add(csr[i]);
                    yield return lineTokens.ToArray();
                }
            }
        }

        static Product ParseProduct(string[] tokens)
        {
            Product product = new Product();

            product.Action = tokens[0];
            product.CategoryPath = tokens[1];
            product.ID = Convert.ToInt32(tokens[2]);
            product.Name = tokens[3];
            product.Code = tokens[4];
            product.Stock = Convert.ToInt32(tokens[5]);

            return product;
        }

        static string ToString(Product product)
        {
            const char SEPERATOR = ',';

            StringBuilder sb = new StringBuilder();
            sb.Append(product.Action.DoubleQuoteString()); sb.Append(SEPERATOR);
            sb.Append(product.CategoryPath.DoubleQuoteString()); sb.Append(SEPERATOR);
            sb.Append(product.ID); sb.Append(SEPERATOR);
            sb.Append(product.Name.DoubleQuoteString()); sb.Append(SEPERATOR);
            sb.Append(product.Code.DoubleQuoteString()); sb.Append(SEPERATOR);
            sb.Append(product.Stock);

            return sb.ToString();
        }
    }
}

必要に応じて、クラスをさまざまなファイルに配置できます。たとえば、Productクラスを独自のファイルに移動します。そしてもちろん、いくつかのエラー処理を追加します。

お役に立てれば。

于 2013-01-03T08:46:39.720 に答える