2010-08-05 6 views
0

J'ai un tableau JS qui écrit dans un fichier texte sur le serveur en utilisant StreamWriter. Telle est la ligne qu'il fait:ASP.NET StreamWriter - nouvelle ligne après x virgules

sw.WriteLine(Request.Form["seatsArray"]); 

Au moment où une ligne est en cours d'écriture avec le contenu du tableau sur elle. Je veux qu'une nouvelle ligne soit écrite après chaque virgule. Exemple tableau:

BN,ST,A1,303,601,BN,ST,A2,303,621,BN,WC,A3,303,641, 

sortie doit:

BN,ST,A1,303,601, 
BN,ST,A2,303,621, 
BN,WC,A3,303,641, 

Je sais que je pourrais utiliser une chaîne remplacer, mais je ne sais comment faire cette sortie une nouvelle ligne après chaque virgule, et non après un certain montant des virgules.

Comment puis-je obtenir cela?

Merci!

Répondre

2

Eh bien, voici la réponse la plus simple que je peux penser à:

string[] bits = Request.Form["seatsArray"].Split(','); 

for (int i = 0; i < bits.Length; i++) 
{ 
    sw.Write(bits[i]); 
    sw.Write(","); 
    if (i % 5 == 4) 
    { 
     sw.WriteLine(); 
    } 
} 

Il est pas très élégant, mais ça va faire le travail, je crois.

Vous voudrez peut-être cette suite pour terminer la ligne courante, si nécessaire:

if (bits[i].Length % 5 != 0) 
{ 
    sw.WriteLine(); 
} 

Je suis sûr qu'il existe des moyens ... mais plus habiles est simple.

Une question: sont les valeurs toujours trois caractères de long? Parce que si oui, vous êtes fondamentalement juste casser la chaîne jusqu'à tous les 20 caractères ...

+0

En fait, votre version a un saut de ligne de fin dans l'échantillon d'entrée, mais malheureusement, il a aussi « » après. StringSplitOptions devrait le faire ou "i

+0

@lasseespeholt: Je passais par votre exemple de sortie qui a aussi une virgule à la fin. –

+0

fonctionne très bien merci, et non, ils ne sont pas toujours 3 caractères (ils sont des coordonnées, donc tout de 1 à 4 caractères.) Acclamations – IceDragon

0

Quelque chose comme:

var input = "BN,ST,A1,303,601,BN,ST,A2,303,621,BN,WC,A3,303,641,"; 
var splitted = input.Split(','); 

var cols = 5; 
var rows = splitted.Length/cols; 

var arr = new string[rows, cols]; 

for (int row = 0; row < rows; row++) 
    for (int col = 0; col < cols; col++) 
     arr[row, col] = splitted[row * cols + col]; 

Je vais essayer de trouver une solution plus élégante. Correctement avec un peu de style fonctionnel dessus.

Mise à jour: Découvrez simplement que ce n'est pas vraiment ce dont vous avez besoin. Avec cela, vous obtenez un tableau 2D avec 3 lignes et 5 colonnes.

Ceci cependant vous donnera 3 lignes. Ils n'ont pas de fin ','. Veux-tu çà? Voulez-vous toujours l'imprimer? Ou voulez-vous avoir accès aux différentes lignes ?:

var splitted = input.Split(new [] { ','}, StringSplitOptions.RemoveEmptyEntries); 

var lines = from item in splitted.Select((part, i) => new { part, i }) 
      group item by item.i/5 into g 
      select string.Join(",", g.Select(a => a.part)); 

Ou par ce code plutôt grand. Mais j'ai souvent besoin d'une méthode "Chunk", donc elle peut être réutilisable. Je ne sais pas s'il y a une méthode "Chunk" intégrée - je ne l'ai pas trouvée.

public static class LinqExtensions 
{ 
    public static IEnumerable<IList<T>> Chunks<T>(this IEnumerable<T> xs, int size) 
    { 
     int i = 0; 

     var curr = new List<T>(); 

     foreach (var x in xs) 
     { 
      curr.Add(x); 

      if (++i % size == 0) 
      { 
       yield return curr; 
       curr = new List<T>(); 
      } 
     } 
    } 
} 

Utilisation:

var lines = input.Split(',').Chunks(5).Select(list => string.Join(",", list));