J'ai un fichier CSV avec un message de colonne spécifique avec l'entrée suivante à l'intérieur que je souhaite séparer correctement. Veuillez noter que cet extrait ci-dessous ne ressemble pas à ceci dans Excel où j'en ai actuellement besoin pour être formaté pour
static void Main(string[] args) { using (TextFieldParser parser = new TextFieldParser(@"C:\Users\t-maucal\Desktop\MachineLearningTestSets\CSVParse.csv")) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(" "); while (!parser.EndOfData) { //Process row string[] fields = parser.ReadFields(); foreach (string field in fields) { Console.WriteLine(field); } } } }
3 Réponses :
C'est beaucoup de travail sujet aux erreurs. Il suffit d'utiliser CSVHelper par Josh Fermer. C'est un excellent colis qui est rapide et facile à utiliser. P>
Votre réponse serait plus utile si vous avez montré comment appliquer csvhelper code> vers les données. Je ne sais pas comment faire cela puisque les données ne sont pas dans un format code> CSV CODE>.
Utilisation de formules, @ cybernétique.nomad avait la majeure partie du chemin là-bas. Afin de supprimer les titres des données que vous pouvez essayer:
Mettez les catégories de chaque colonne (CorrélationID:, Demande d'API :) Dans les cellules dans dans dans dans in in B1: G1 CODE> P> LI>
B2 code>, utilisez la formule suivante: p>
c2 code>, utilisez la formule suivante: p>
d2 code>, utilisez la formule suivante: p>
E2 code>, utilisez la formule suivante: p>
F2 code>, utilisez la formule suivante: p>
g2 code>, utilisez la formule suivante: p>
=RIGHT($A2,LEN($A2)-FIND(G$1,$A2)-LEN(G1))
Je ne sais pas pourquoi mais ça me donne #value? Dans tous ceux, à l'exception de la 1ère colonne de formule. Savez-vous pourquoi @luck
Vous pouvez utiliser une macro écrite dans VBA.
J'ai créé une classe et renommé IT Puis j'ai utilisé des expressions régulières Pour séparer les différentes propriétés des données que vous avez fournies, collectées dans un dictionnaire et génèrent les résultats à une feuille de calcul distincte dans une commande spécifiée. P> J'ai supposé que vos en-têtes de colonne nommés étaient les informations que vous recherchez. Pour, et comme dans votre exemple de texte, il n'ya qu'un seul exemple de chaque catégorie à préoccuper. P> J'ai également supposé que vos données commencent dans Lire les notes de près dans la macro. p> Assurez-vous de définir les références comme indiqué dans le code de module normal. P> CDATA code> avec des propriétés de vos différentes en-têtes de colonne. P>
B1 code>. P>
'Set Reference to Microsoft Scripting Runtime
'Set Reference to Microsoft VBScript Regular Expressions 5.5
Option Explicit
Sub ttcSpecial()
Dim wsSrc As Worksheet, wsRes As Worksheet
Dim vSrc As Variant, vRes As Variant
Dim rRes As Range
Dim dD As Dictionary
Dim RE As RegExp, MC As MatchCollection, M As Match
Dim cD As cData
Dim myKey, I As Long, sTemp As String
Set wsSrc = Worksheets("sheet1")
Set wsRes = Worksheets("sheet2")
Set rRes = wsRes.Cells(1, 1)
With wsSrc
vSrc = .Range(.Cells(1, 2), .Cells(.Rows.Count, 2).End(xlUp))
If Not IsArray(vSrc) Then
sTemp = vSrc
ReDim vSrc(1 To 1, 1 To 1)
vSrc(1, 1) = sTemp
End If
End With
Set RE = New RegExp
With RE
.Global = True
.IgnoreCase = True
.MultiLine = False
.Pattern = "((?:CorrelationID|Request For API|Caller|RequestedSchemas|TenantID)):([\s\S]+?)(?=(?:CorrelationID|Request For API|Caller|RequestedSchemas|TenantID|$))"
End With
Set dD = New Dictionary
dD.CompareMode = TextCompare
For I = 1 To UBound(vSrc, 1)
Set cD = New cData
With cD
If RE.Test(vSrc(I, 1)) = True Then
myKey = I
Set MC = RE.Execute(vSrc(I, 1))
For Each M In MC
Select Case M.SubMatches(0)
Case "CorrelationID"
.CorrelationID = M.SubMatches(1)
Case "Request for API"
.RequestForApi = M.SubMatches(1)
Case "Caller"
.Caller = M.SubMatches(1)
Case "RequestedSchemas"
.RequestedSchemas = M.SubMatches(1)
Case "TenantID"
.TenantID = M.SubMatches(1)
End Select
Next M
dD.Add Key:=myKey, Item:=cD
End If
End With
Next I
ReDim vRes(0 To dD.Count, 1 To 5)
'Headers
vRes(0, 1) = "Correlation ID"
vRes(0, 2) = "Request for API"
vRes(0, 3) = "Caller"
vRes(0, 4) = "Requested Schemas"
vRes(0, 5) = "Tenant ID"
I = 0
For Each myKey In dD.Keys
I = I + 1
With dD(myKey)
vRes(I, 1) = .CorrelationID
vRes(I, 2) = .RequestForApi
vRes(I, 3) = .Caller
vRes(I, 4) = .RequestedSchemas
vRes(I, 5) = .TenantID
End With
Next myKey
Set rRes = rRes.Resize(UBound(vRes, 1) + 1, UBound(vRes, 2))
With rRes
.EntireColumn.Clear
.Value = vRes
With .Rows(1)
.Font.Bold = True
.HorizontalAlignment = xlCenter
End With
.EntireColumn.AutoFit
End With
End Sub
Je n'ai jamais utilisé VBA avant. Pouvez-vous expliquer comment utiliser ceci
@ Brigitte1trick Il y a beaucoup d'informations sur vous et je suis sûr que vous pouvez reproduire les étapes dans c # code>. Mais brièvement, pour entrer cette macro (SUB),
alt-f11 code> ouvre l'éditeur Visual Basic. Assurez-vous que votre projet est mis en surbrillance dans la fenêtre de l'explorateur de projet. Ensuite, dans le menu supérieur, sélectionnez
Insérer / Module Code> et coller le code ci-dessous dans la fenêtre qui s'ouvre. Vous ferez quelque chose de similaire avec le module code> code> et le renommer à l'aide de la fenêtre code> code>. Pour utiliser cette macro (SUB),
Alt-F8 code> Ouvre la boîte de dialogue Macro. Sélectionnez la macro par nom et Exécuter B>.
@ Brigitte1trick Assurez-vous de lire attentivement le code pour que vous le comprenne et que vous puissiez l'adapter à votre situation spécifique.
Compiler Erreur: Type défini par l'utilisateur non défini (DIM DD AS Dictionnaire) @ron Rosenfeld Savez-vous ce que cela signifie?
@ Brigitte1trick quelle ligne?
Rosenfield 4 et 8
@ Brigitte1trick Pas utile car aucune ligne n'a de numéro. Mais probablement, vous n'avez pas défini les références comme indiqué dans les notes; et / ou vous n'avez pas renommé le module de classe.
Laissez-nous Continuez cette discussion en chat .
@ Bridgitte1trick Qu'est-ce que vous obtenez comme vos résultats via votre code?
Comment vous seriez distinct entre valeur antérieure et nom de la valeur suivante? ": B99FB632-78CF-4910-AB23-4F69833ED2D9 Demande d'API:"
@Fabio Les noms de colonne sont corrélationID, demande d'API, de l'appelant, du schéma demandé et de l'identifiant de locataire
Ensuite, recherchez les noms de colonne dans cette chaîne (y compris le côlon) et extrayez les valeurs de colonne de la chaîne. Vous connaissez que le contenu de chaque colonne commence juste derrière son nom de colonne (incl. Le côlon) et il se termine juste avant le prochain nom de colonne que
Je ne comprends pas ce que vous cherchez à faire que les réponses à votre dernier post n'ont pas fait. Qu'est-ce que cela signifie?: "Les noms de la colonne seront avant le côlon et les informations à l'intérieur de ce sera ce qui est après le côlon." Pouvez-vous inclure une meilleure illustration de ce que vous attendez de la feuille de calcul à ressembler?
@Luck j'ai ajouté des images maintenant
Vous pouvez analyser cela assez facilement avec VBA et des expressions régulières. J'imagine que tu pouvais aussi faire ça en C #.