0

データテーブルの文字列をdoubleに解析する必要があります。私はデータテーブル(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. 列に空の文字列があります。それらを2倍に解析することはできません。string.IsNullOrWhitespace()まず、または同様のものを使用して、それを確認する必要があります。
  3. あなたの文化は間違っています。CSVファイルに小数点を使用する緯度と経度の値がある場合がありますが、現在のスレッドカルチャでは小数点記号としてカンマを使用している可能性があります。カルチャをパラメータとして受け入れるオーバーロードDecimal.Parse()があります(あなたが提供するCultureInfo.InvariantCultureか、他のものを指定することができますCultureInfo)。
于 2012-06-28T23:44:32.857 に答える