尝试解析时出错从.csv文件转换文本

时间:2018-04-07 07:00:44

标签: c# csv parsing for-loop openfiledialog

我目前只是试图让.csv文件中最后一列的输出正常工作。我需要它转换为货币。我不确定我是否使用(i == 6)整列(如果这是一个有用的东西)或者我必须这样做(i == 13 || i == 20 || i == 27)等每个需要转换为货币的价值。

我正在努力实现的目标:

单击“加载库存”按钮时,将读取库存记录 从使用“打开文件对话框”控件的文本文件中,从文件读取的行被标记为字段值,进行解析(根据需要),然后加载到列表框和类实例列表中。除了输入文件中的所有字段值之外,ListBox(和类实例列表)还应包含QtyHand和Sales的列。 String.Format()或PadRight()方法可用于格式化列表框内容,以便在使用等宽字体时对齐列中的所有值。

.csv文件的前两行是:

published_at

非常感谢任何有关排序的帮助。

ALTER TABLE `news_article_counts` CHANGE `published_at` `published_at` TIMESTAMP NOT NULL;

2 个答案:

答案 0 :(得分:0)

嗯,这是没有其他细节的快速解决方案,但简而言之,您需要存储新格式化的项目,我希望这很清楚,你可以继续。更新为更好的格式化代码。

static void Main(string[] args)
    {
        List<string> outputList = new List<string>();
        string[] list = new string[] { "85 - 0521031, Shampoo, 35, 9, 0, 0, 2.89", "86 - 0521031, Guitar, 35, 9, 0, 0, 9.89" };
        for(var i=0; i<list.Length; i++)
        {
            var listItem = list[i].Split(',');
            var outputListItem = "";

            for (var j=0; j<listItem.Length; j++)
            {
                if(j == 6)
                {
                    double price = double.Parse(listItem[j]);
                    listItem[j] = String.Format("{0:C2}", price).PadRight(20, ' '); ;
                }
                outputListItem = string.Join(" ", listItem);
            }

            Console.WriteLine(outputListItem);
            outputList.Add(outputListItem);
        }
        Console.ReadLine();
    }

答案 1 :(得分:0)

我建议使这个面向对象,这看起来像库存。所以第一步是制作库存类。在Inventory类中,将使用字符串作为加载库存的文件名(这可能需要根据您的实际数据类型和错误处理要求进行修改)。

    public class Inventory
    {
        public string Id { get; set; }
        public string ItemName { get; set; }
        public int StartingQty { get; set; }
        public int QtyMinRestck { get; set; }
        public int QtySold { get; set; }
        public int QtyRStcked { get; set; }
        public decimal UnitPrice { get; set; }

        public Inventory()
        {

        }

        //this overrides the default .ToString() method to provide
        //columnar output and formats the UnitPrice to currrency
        //this requires the following: using System.Globalization;
        public override string ToString()
        {
            return String.Format("{0}{1}{2}{3}{4}{5}{6}"
                , Id.PadRight(15, ' ')
                , ItemName.PadRight(30, ' ')
                , StartingQty.ToString().PadLeft(10, ' ')
                , QtyMinRestck.ToString().PadLeft(10, ' ')
                , QtySold.ToString().PadLeft(10, ' ')
                , QtyRStcked.ToString().PadLeft(10, ' ')
                , UnitPrice.ToString("C", CultureInfo.CurrentCulture).PadLeft(10, ' '));
        }

        //this loads a collection of inventory objects from a file
        //it would ignore any lines with errors
        public IEnumerable<Inventory> Load(string InventoryFileName)
        {
            var inventories = new List<Inventory>();

            using (var sr = new StreamReader(InventoryFileName))
            {
                sr.ReadLine(); //skip the first line
                while (!sr.EndOfStream)
                {
                    try
                    {
                        var fields = sr.ReadLine().Split(',');

                        inventories.Add(new Inventory
                        {
                            Id = fields[0]
                            ,
                            ItemName = fields[1]
                            ,
                            StartingQty = Int32.Parse(fields[2])
                            ,
                            QtyMinRestck = Int32.Parse(fields[3])
                            ,
                            QtySold = Int32.Parse(fields[4])
                            ,
                            QtyRStcked = Int32.Parse(fields[5])
                            ,
                            UnitPrice = Decimal.Parse(fields[6])
                        });
                    }
                    catch
                    {
                        //handle error here
                    }


                }
            }

            return inventories;
        }
    }

现在我们有了这个课程,您可以轻松地调用它并从文件中获取库存:

inventoryListBox.Items.Clear(); //清除列表框项目

    if (ipFile.ShowDialog() == DialogResult.OK) //show dialog box
    {
        Inventory inventory = new Inventory();
        var inventories = inventory.Load(ipFile.FileName);
        //sets the datasource of the list box to the collection of inventory
        //by default it calls the ToString() method which which overrode
        //to provide columar output
        inventoryListBox.DataSource = inventories;
    }

这是一个非常基本的实现,但它应该使将来更容易维护。您还可以使用“库存”作为列表框的数据源。