2009-11-25 7 views
2

J'ai une application web hébergée sur intranet où l'utilisateur va télécharger un fichier texte avec des données délimitées par des espaces dans 5 colonnes. Je ne souhaite pas sauvegarder le fichier alors je voulais juste l'utiliser en mémoire. J'ai essayé plusieurs exemples différents sur le web et aucun n'a fonctionné. Enfin, un collègue m'a montré comment faire cela. Voici le code et je me demande s'il y a une meilleure façon de le faire. En fin de compte, tout ce que je veux, c'est un moyen de lier les données à une grille ou un répéteur pour l'affichage et le stockage ultérieur dans une base de données (SQL Server).Téléchargement de fichier lu en mémoire et utilisé comme fichier texte - existe-t-il un meilleur moyen?

La balise asp fichier de téléchargement ID est SurveyFileUpload
Le SurveyDate est un aspic: champ de saisie

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); 
} 

Cela fonctionne bien. Je ne connais pas bien LINQ et j'ai eu du mal avec la partie du flux de fichiers.

Répondre

1

Eh bien, vous pouvez exécuter Regex.Split (ligne, "[] +") une seule fois et utiliser le résultat stocké pour remplir les champs. Regex est assez cher en comparaison.

De même, avez-vous vérifié s'il reste des '\ r' dans vos champs? De nombreux fichiers texte contiennent à la fois '\ n' et '\ r'.

1

À part les suggestions de MandoMando, il n'y en a pas beaucoup. Je suppose que c'est un code de prototype (basé sur le nom de la méthode) ou je dirais que les trucs de manipulation de fichiers devraient être enveloppés dans une classe pour encapsuler le format et isoler les changements. L'implémentation de la suggestion de suppression du \ r est assez simple.

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

Pour nettoyer les appels supplémentaires aux fonctions regex, vous pouvez le faire comme ça. Je n'ai pas 2008/10 au travail pour les tester, mais ils devraient fonctionner.

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] 
       }; 
4

J'utilise cette méthode. Je lis dans les numéros d'identification d'un fichier texte avec un numéro d'identification par ligne:

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); 
}