6
votes

Comment scinderiez-vous par \ r \ n si string.split (chaîne []) n'existait pas?

Utilisation du travail microframe .NET qui est une version vraiment découpée de C #. Par exemple, System.string a à peine l'une des goodies que nous " J'ai apprécié au fil des ans.

J'ai besoin de diviser un document texte en lignes, ce qui signifie diviser par \ r \ n. Toutefois, String.Split ne fournit qu'une division par char, pas par chaîne.

Comment puis-je diviser un document en lignes de manière efficace (par exemple, ne pas boucler follement sur chaque caractère dans la doc)?

P.s. System.string manque également une méthode de remplacement, de sorte que cela ne fonctionne pas.
P.p.s. Regex ne fait pas partie du microframework non plus.


1 commentaires

Ce n'est pas une version coupée de C #; C'est une version de coupe du .NET Framework.


7 Réponses :


2
votes

Qu'en est-il de: xxx pré>

ou p> xxx pré>

readind qui . NET Micro Framework 3.0 , ce code peut fonctionner: P>

string line = String.Empty;
StreamReader reader = new StreamReader(path);
while ((line = reader.ReadLine()) != null)
{
    // do stuff
}


4 commentaires

Il se divise par les deux articles dans le Charrayray séparément. Ainsi, vous obtiendrez un tas d'résultats vides en plus des résultats légitimes.


@Angryhacker: removeemptyentries devraient traiter avec eux;


File.Readalllines n'est pas prise en charge non plus.


Voir le lien fourni dans la question de la documentation sur ce qui est pris en charge.



6
votes

Je voudrais faire boucler chaque caractère dans le document, car c'est clairement nécessaire. Comment pensez-vous string.split fonctionne? J'essaierais de le faire seulement frapper chaque personnage une fois.

Gardez une liste de cordes trouvées jusqu'à présent. Utilisez à plusieurs reprises indexofof , passant dans le décalage en cours dans la chaîne (c'est-à-dire la correspondance précédente + 2).


2 commentaires

True, mais la mise en œuvre complète de Split (String []) utilise des pointeurs et un code dangereux pour obtenir la performance qu'elle fait. Sinon, je voudrais simplement copier le code. Je travaille sur une puce d'extrémité très basse et j'espérais que quelque chose d'extrêmement intelligent.


Si vous ne divisez que par une seule chaîne de délimitation et que le délimiteur est plus long que 3 caractères, vous pouvez obtenir de meilleures performances en utilisant l'une des variantes d'algorithme de recherche Boyer-Moore. Pas que cela aide le problème de l'affiche, dans ce cas. en.wikipedia.org/wiki/...



3
votes

Comment puis-je diviser un document en lignes de manière efficace (par exemple, ne pas boucler follement sur chaque caractère dans la doc)?

Comment pensez-vous que l'intégré fractionné fonctionne?

Il suffit de le réimplémenter comme une méthode d'extension.


0 commentaires

11
votes

Vous pouvez faire

string[] lines = doc.Split('\n');
for (int i = 0; i < lines.Length; i+= 1)
   lines[i] = lines[i].Trim();


2 commentaires

Oui, cela fait le tour et conserve la plupart des caractéristiques de performance. Merci. Assez intelligent.


J'étais sur le point de suggérer quelque chose comme ça - battez-moi au coup de poing. Vous devrez peut-être recombiner les chaînes (théoriquement) si '\ n' n'est pas toujours précédée de "\ r" dans l'entrée.



0
votes

Cela peut aider dans certains scénarios:

StreamReader reader = new StreamReader(file);    
string _Line = reader.ReadToEnd();
string IntMediateLine = string.Empty;
IntMediateLine = _Line.Replace("entersign", "");
string[] ArrayLineSpliter = IntMediateLine.Split('any specail chaarater');


1 commentaires

Dans quels scénarios? Pouvez-vous fournir quelques détails s'il vous plaît.



0
votes

Si vous souhaitez un Microframework compatible em> Fonction fractionnée qui fonctionne pour une chaîne de caractères forte>, voici celle qui fait le truc, semblable à la version des cadres ordinaires Utilisation de StringSplitoption.None:

    private static string[] Split(string s, string delim)
    {
        if (s == null) throw new NullReferenceException();

        // Declarations
        var strings = new ArrayList();
        var start = 0;

        // Tokenize
        if (delim != null && delim != "")
        {
            int i;
            while ((i = s.IndexOf(delim, start)) != -1)
            {
                strings.Add(s.Substring(start, i - start));
                start = i + delim.Length;
            }
        }

        // Append left over
        strings.Add(s.Substring(start));

        return (string[]) strings.ToArray(typeof(string));
    }


1 commentaires

J'ai pensé à la transformer en une méthode d'extension selon Cette possibilité



-2
votes

Vous pouvez diviser votre chaîne avec une sous-chaîne.

String.Split(new string[] { "\r\n" }, StringSplitOptions.None);


0 commentaires