Estoy trabajando en una aplicación de mapas meteorológicos que importa archivos csv a través de una URL. Los campos de fecha dentro del csv se almacenan como una cadena como 201601280330, que sería la fecha de hoy 28/1/2016 3:30. Sin embargo, cuando se lee el csv a través de un lector de flujo, el valor vuelve en notación científica como 2.01601E + 11. Nada de lo que he probado parece devolver el valor total 201601280330.

Por ejemplo:

var date = "2.01601E+11"; var d = Decimal.Parse(date, System.Globalization.NumberStyles.Float);

Devuelve 201601000000 cortando la parte restante de la cadena. ¿Alguien sabe una forma de devolver el valor total? Cuando guardo el csv localmente como un archivo de texto, se guarda el valor correcto 201601280330 en lugar de 2.01601E+11. De todos modos, ¿obtener esto en el código sin tener que guardar primero? Estoy usando el siguiente código para leer el archivo csv.

    public static DataTable GetDataTableFromCSVFile(string path)
    {
        DataTable dt = new DataTable();
        try
        {
            using (StreamReader sr = new StreamReader(path))
            {
                string[] headers = sr.ReadLine().Split(',');

                foreach (string header in headers)
                {
                    if (header.Contains("ERROR:"))
                    {
                        return null;
                    }

                    dt.Columns.Add(header);
                }
                while (!sr.EndOfStream)
                {
                    string[] rows = sr.ReadLine().Split(',');
                    DataRow dr = dt.NewRow();
                    for (int i = 0; i < headers.Length; i++)
                    {
                        dr[i] = rows[i];
                    }
                    dt.Rows.Add(dr);
                }
            }
        }

EDITAR

Aunque esto no proporciona una respuesta técnica al problema que estaba experimentando, podría proporcionar una mejor explicación y ayudar a otros si experimentan esto. Algunos de los archivos csv de ejemplo que me enviaron para probar se habían editado en Excel para hacer el csv más pequeño y luego se guardaron. Después de más pruebas, parece que el problema ocurre solo para los archivos csv editados en Excel. Tentativamente, esto me resuelve el problema, ya que no descargaremos los archivos csv y los editaremos en Excel, sino que los extraeremos directamente de una URL. El código que publiqué arriba leerá el valor correcto sin notación, mientras que para el csv editado en Excel solo leerá el valor con notación científica. A menos que me equivoque, asumo que Excel debe agregar algo a los archivos csv editados que evite que el valor se lea correctamente.

1
R Cash 28 ene. 2016 a las 19:53

2 respuestas

La mejor respuesta

Mi respuesta original cuestionaba si estaba usando Excel, pero como no lo había mencionado en su pregunta, me dijeron correctamente que estaba fuera de tema, así que lo cambié. Ahora que ha proporcionado una respuesta de seguimiento que menciona Excel, lo he vuelto a cambiar, esto es lo que escribí originalmente:

Una vez que el valor se ha convertido en notación científica, no se puede volver a convertir. Es una limitación de Excel que está realizando esta conversión. Si, al importar los datos, elige un tipo de columna de Texto (en lugar de General), entonces los datos se importarán literalmente y Excel no los convertirá a notación científica.

Como sospechaba, es Excel (no su código) el que está cambiando los datos numéricos a notación científica. He visto este problema muchas veces y sugiero que la gente NO abra archivos CSV usando Excel. Si es necesario, entonces importe en lugar de abrir para que pueda especificar los tipos de datos de sus columnas numéricas.

2
Owain Williams 29 ene. 2016 a las 12:23

Aunque esto no proporciona una respuesta técnica al problema que estaba experimentando, podría proporcionar una mejor explicación y ayudar a otros si experimentan esto. Algunos de los archivos csv de ejemplo que me enviaron para probar se habían editado en Excel para hacer el csv más pequeño y luego se guardaron. Después de más pruebas, parece que el problema ocurre solo para los archivos csv editados en Excel. Tentativamente, esto me resuelve el problema, ya que no descargaremos los archivos csv y los editaremos en Excel, sino que los extraeremos directamente de una URL. El código que publiqué arriba leerá el valor correcto sin notación, mientras que para el csv editado en Excel solo leerá el valor con notación científica. A menos que me equivoque, asumo que Excel debe agregar algo a los archivos csv editados que evite que el valor se lea correctamente.

0
R Cash 28 ene. 2016 a las 22:05