0

我需要将数据表中的字符串解析为双精度。我有一个数据表(dt),它有不同的列,并且这些列中的每一列都使用该.ToString()方法转换为字符串。但是,当我尝试输出数据的纬度和经度时,出现错误“输入字符串的格式不正确”。所以我想我的主要问题是,如何从使用该.ToString()方法转换为字符串的对象中解析文本..

using System;
using System.IO;
using System.Collections;
using System.Data;

namespace SalesMap
{
    class SalesMap
    {
        private static DataTable InitData1()
        {
            //Datatable for entire list of zipcodes
            DataTable datat = new DataTable("DATA");
            DataColumn state = new DataColumn();
            DataColumn county = new DataColumn();
            DataColumn statecounty = new DataColumn();
            DataColumn latitude = new DataColumn();
            DataColumn longitude = new DataColumn();
            DataColumn salesperson = new DataColumn();

            //Add the columns to the datatable
            datat.Columns.Add(state);
            datat.Columns.Add(county);
            datat.Columns.Add(statecounty);
            datat.Columns.Add(latitude);
            datat.Columns.Add(longitude);
            datat.Columns.Add(salesperson);

            return datat;
        }       

        private static String InitPath()
        {
            string path = "C:/Documents and Settings/Andre/Desktop/salesmapdata/MapPointCountyLatLong.csv";
            return path;
        }

        public static void Main()
        {
            try
            {
                DataTable dt = InitData1();
                StreamReader sr = new StreamReader(InitPath());
                String csvData = string.Empty;

                while ((csvData = sr.ReadLine()) != null)
                {
                    String[] data = csvData.Split(',');
                    //dt.Rows.Add(data);
                    DataRow newRow1 = dt.NewRow();
                    newRow1[0] = data[0].ToString(); //state
                    newRow1[1] = data[1].ToString(); //county
                    newRow1[2] = data[2].ToString(); //state|county
                    newRow1[3] = data[3].ToString(); //latitude
                    newRow1[4] = data[4].ToString(); //longitude
                    newRow1[5] = data[5].ToString(); //salesperson
                    dt.Rows.Add(newRow1);

                    Console.WriteLine("Row added for: dt");
                }

                foreach (DataRow row1 in dt.Rows)
                {
                    double latitude1 = Double.Parse(row1[3].ToString());
                    double longitude1 = Double.Parse(row1[4].ToString());

                    if (row1[5].ToString() != "UNKNOWN" || row1[5].ToString() != "SALESMAN")
                    {
                        Console.WriteLine(latitude1);
                        Console.WriteLine(longitude1);
                    }
                }

                dt.WriteXml(@"c:\test\dt1.xml");
                sr.Close();
            }

            catch (Exception e)
            {
                StreamWriter sw = new StreamWriter(@"c:\test\error.txt");
                sw.WriteLine(e.Message.ToString());
                sw.Close();
            }
        }
    }
}
4

1 回答 1

2

首先,当从 CSV 文件读取数据时,您不需要调用data[x].ToString()每个数组元素,因为它们已经是字符串。

Double.Parse 调用可能遇到的几个潜在问题:

  1. CSV 文件中的数据确实格式错误(可能是您放错了列号,或者数据可能包含无法解析的附加符号,就像 Tim 在他的评论中提到的那样)。
  2. 您的列中有空字符串。那些不能被解析为加倍。你需要先检查一下,使用string.IsNullOrWhitespace()或类似的东西。
  3. 你的文化是错误的。您的 CSV 文件中可能有使用小数点的纬度和经度值,但您当前的线程文化可能使用逗号作为小数分隔符。有一个接受 Culture 作为参数的重载Decimal.Parse()CultureInfo.InvariantCulture(您可以提供或任何其他CultureInfo)。
于 2012-06-28T23:44:32.857 回答