J'ai eu un petit problème ici, je cherche une meilleure façon de fractionner les cordes.
Par exemple, je reçois une chaîne ressemblant à ceci. Je connais le modèle La chaîne est construite avec et j'ai un tableau de nombres comme celui-ci. P> 4,5,4,7,9
0000 - JHASDF - +442 - 9901234 - ALEXANDER
6 Réponses :
the Méthode Split Regex serait une possibilité, mais puisque vous Ne pas avoir de délimiteur spécifique dans la chaîne, je doute qu'il soit d'une utilisation et il est peu probable qu'il soit plus rapide. P>
string.substring est également une possibilité. Vous l'utilisez comme: var myfirstring = Fullstring.Substring (0, 4) Code> P>
Peut-être quelque chose comme ceci:
string[] SplitString(string s,int[] parts)
{
string[] result=new string[parts.Length];
int start=0;
for(int i=0;i<parts.Length;i++)
{
int len=parts[i];
result[i]=s.SubString(start, len);
start += len;
}
if(start!=s.Length)
throw new ArgumentException("String length doesn't match sum of part lengths");
return result;
}
N'EST PAS MID UNE MÉTHODE VB?
string firstPart = string.Substring(0, 4); string secondPart = string.Substring(4, 5); string thirdPart = string.Substring(9, 4); //...
comme la fonction et ainsi de suite. P> P> MID () code> est VB, vous pouvez simplement essayer
Je sais, je reçois toujours un peu confus vb.net / C # programmation avec un au travail et un à la maison. : P
var lengths = new[] { 4, 6, 4, 7, 9 };
var parts = new string[lengths.Length];
// if you're not using .NET4 or above then use ReadAllLines rather than ReadLines
foreach (string line in File.ReadLines("YourFile.txt"))
{
int startPos = 0;
for (int i = 0; i < lengths.Length; i++)
{
parts[i] = line.Substring(startPos, lengths[i]);
startPos += lengths[i];
}
// do something with "parts" before moving on to the next line
}
Merci, c'est presque la même chose que j'ai déjà eue, à la recherche d'autre chose, mais s'il n'y a pas de moyen meilleur ou plus rapide de le faire, je n'ai simplement pas à vivre avec elle.
@ user777382: Vous pourrez peut-être devenir légèrement plus rapide avec de petits modifications et micro-optimisations, mais je ne pense pas que vous trouverez beaucoup plus rapidement que cette approche générale.
-1 pour une utilisation inutile de la liste, car la longueur de la matrice est connue à l'avance
@George: Je serais surpris que cela rend toute différence de performance significative, et ce serait au détriment de rendre le code moins lisible (certes que légèrement moins). Je ne pense pas que cela vaut vraiment la peine d'être un bowvote: si l'OP pense que c'est une micro-optimisation qui mérite d'être en train de faire alors qu'ils sont libres de le faire.
@Lukeh. La performance était dans la question initiale. Nous économisons au moins un appel de méthode et la création de tout nouvel objet sur le tas.
@George: Et pensez-vous que cela va même être notable ici? Je serais émerveillé si vous pouvez me montrer une référence où la différence entre la matrice et la liste n'est pas enterrée par le fichier E / S.
@Lukeh: Moyenne: Liste: 11208.41 Moyenne: Array: 7269.78666666667 Array est plus rapide par: 1.54177976795284, Fréquence de chronomètre: 3579545
Je sais que cela est en retard, mais dans l'espace de noms Microsoft.visalbasic.fileio, vous pouvez trouver le TextFieldParser et il ferait une meilleure tâche de gérer votre problème. Voici un lien vers MSDN - https://msdn.microsoft.com/fr- US / Bibliothèque / Zezabash.aspx avec une explication. Le code est en VB, mais vous pouvez facilement le convertir en C #. Vous devrez ajouter une référence à l'espace de noms Microsoft.visalbasic.fileio également. J'espère que cela aide tout le monde trébuchant sur cette question à l'avenir.
Voici ce dont il ressemblerait dans VB pour le problème du questionneur: P>
Using Reader As New Microsoft.VisualBasic.FileIO.
TextFieldParser("C:\TestFolder\test.log")
Reader.TextFieldType =
Microsoft.VisualBasic.FileIO.FieldType.FixedWidth
Reader.SetFieldWidths(4, 6, 4, 7, 9)
Dim currentRow As String()
While Not Reader.EndOfData
Try
currentRow = Reader.ReadFields()
Dim currentField As String
For Each currentField In currentRow
MsgBox(currentField)
Next
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message &
"is not valid and will be skipped.")
End Try
End While
End Using
Merci, j'ai essayé ça et ça marche bien. Mais malheureusement, ce n'est pas plus rapide aussi loin que je peux voir jusqu'à présent. J'utilisera toujours que si j'en ai besoin dans le futur ou si je dois réécrire l'ancien code. :)
@LIM, Eh bien, je m'avais pensé que vous aviez déjà eu une solution, c'était donc pour les gens comme moi qui ont trébuché sur cette question. Je pense que le TextfieldParse, sans plus rapide, il serait plus facile de comprendre. Il a également une manipulation des erreurs lorsqu'une ligne ne correspond pas aux résultats attendus. Merci pour les commentaires cependant.
string.substring code> est le moyen d'aller, il ne sera certainement pas plus rapide avec des expressions régulières ...BTW, vos chiffres sont faux, il devrait être 4,6,4,7,9 (JHASDF est 6 caractères, pas 5)