Carga de archivos de lectura a la memoria y su uso como archivo de texto – hay una manera mejor?

Tengo una intranet alojado en la web de la aplicación donde el usuario podrá cargar un archivo de texto con espacio delimitado de datos en 5 columnas. No deseo guardar el archivo, así que quería usarlo sólo en la memoria. He probado muchas diferentes ejemplos en la web y ninguno funcionó. Por último, un compañero de trabajo me mostró cómo hacerlo. Aquí está el código y me pregunto si hay una manera mejor de hacer esto. Al final, todo lo que quiero es una manera de vincular los datos a un gridview o repetidor para la visualización y posterior almacenamiento en una base de datos (SQL Server).

La carga de archivos asp ID de etiqueta es SurveyFileUpload

El SurveyDate es un asp:campo de entrada

Int32 fileLen = SurveyFileUpload.PostedFile.ContentLength;

//Create a byte array to hold the contents of the file.
Byte[] buffer = new Byte[fileLen];

//Initialize the stream to read the uploaded file.
Stream s = SurveyFileUpload.FileContent;

//Read the file into the byte array.
s.Read(buffer, 0, fileLen);

//Convert byte array into characters.
ASCIIEncoding enc = new ASCIIEncoding();
string str = enc.GetString(buffer);
testReadFile(str, db_surveyDate.Text);

protected void testReadFile(string inFileString, string inSurveyDate)
{
    string[] lines = inFileString.Split('\n');
    curFileListing.InnerHtml = "";
    int curRow = 1;
    var readings = from line in lines
       select new
       {
           //this is just for display purposes to show the number of rows on the page
           Row = curRow++,
           SurveyDate = inSurveyDate,
           ItemNumber = Regex.Split(line, "[ ]+")[0],
           Northing = Regex.Split(line, "[ ]+")[1],
           Easting = Regex.Split(line, "[ ]+")[2],
           Elevation = Regex.Split(line, "[ ]+")[3],
           Name = Regex.Split(line, "[ ]+")[4]
       };
    saveFileData.Visible = true;
    GridView fileData = new GridView();
    fileData.DataSource = readings;
    fileData.DataBind();
    fileData.AlternatingRowStyle.BackColor = 
           System.Drawing.ColorTranslator.FromHtml("#eee");
    curFileListing.Controls.Add(fileData);
}

Esto funciona OK. Yo no soy ese conocimiento con LINQ y he tenido un momento difícil con la secuencia de archivo de la parte.

InformationsquelleAutor Polo Herrera | 2009-11-25

3 Kommentare

  1. 5

    Yo uso este método. Estoy leyendo en los números de id de un archivo de texto con un número de identificación por línea:

    if (fileUpload.HasFile)
    {
        using (Stream fileStream = fileUpload.PostedFile.InputStream)
        using (StreamReader sr = new StreamReader(fileStream))
        {
            string idNum = null;
            while ((idNum = sr.ReadLine()) != null)
            {
                //Verify the line is in the expected id format
                if (Regex.IsMatch(idNum, this.InputRegex))
                {
                    //Do Stuff with input
                }
                else
                {
                    Log.LogDebug("{0}Invalid input format.", LoggingSettings.logPrefix);
                }
            }
        }
    
    }
    else
    {
        Log.LogDebug("{0}No file present.", LoggingSettings.logPrefix);
    }
  2. 1

    Bien, podría ejecutar Regex.Split(línea, «[ ]+») sólo una vez, y utilizar los resultados almacenado para rellenar los campos. Regex es bastante caro en comparación.

    También, ha revisado para ver si hay a la izquierda sobre el ‘\r’ en los campos? Muchos archivos de texto que contienen ‘\n’ y ‘\r’.

  3. 1

    Otras de las sugerencias de MandoMando, no hay mucho. Estoy asumiendo que es el prototipo de código (basado en el nombre del método) o yo diría que el manejo de archivos de cosas debe ser envuelto en una clase para encapsular el formato, y aislar los cambios.

    La implementación de la propuesta de la eliminación de la \r es bastante simple.

    string[] lines = inFileString.Replace( '\r', '\n' ).Split( new[]{'\n'}, StringSplitOptions.RemoveEmptyEntries );

    Para la limpieza de la extra de las llamadas a las funciones regex, usted podría hacerlo así. No tengo 2008/10 en el trabajo para poner a prueba estos, pero ellos deben trabajar.

    var records = from line in lines
    select line.Split( ' ', StringSplitOptions.RemoveEmptyEntries );
    
    var readings = from record in records
                   select new 
                   {
                       Row = curRow++,
                       SurveyDate = inSurveyDate,
                       ItemNumber = record[0],
                       Northing = record[1],
                       Easting = record[2],
                       Elevation = record[3],
                       Name = record[4]
                   };

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea