0
votes

Quelle serait la façon la plus efficace d'analyser l'entrée d'une colonne spécifique dans des colonnes séparées?

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


7 commentaires

@ 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 #.


3 Réponses :


0
votes

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.


1 commentaires

Votre réponse serait plus utile si vous avez montré comment appliquer csvhelper vers les données. Je ne sais pas comment faire cela puisque les données ne sont pas dans un format CSV .



0
votes

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:

  1. Mettez les catégories de chaque colonne (CorrélationID:, Demande d'API :) Dans les cellules B1: G1 CODE> P> LI>

  2. dans B2 code>, utilisez la formule suivante: p> XXX PRE> LI>

  3. dans c2 code>, utilisez la formule suivante: p> XXX PRE> LI>

  4. dans d2 code>, utilisez la formule suivante: p> XXX PRE> LI>

  5. dans E2 code>, utilisez la formule suivante: p> XXX PRE> LI>

  6. in F2 code>, utilisez la formule suivante: p> XXX PRE> LI>

  7. in g2 code>, utilisez la formule suivante: p>

    =RIGHT($A2,LEN($A2)-FIND(G$1,$A2)-LEN(G1))
    


1 commentaires

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



0
votes

Vous pouvez utiliser une macro écrite dans VBA.

J'ai créé une classe et renommé IT CDATA code> avec des propriétés de vos différentes en-têtes de colonne. P>

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 B1 code>. P>

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>

MODULE STRUT> 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


8 commentaires

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 # . Mais brièvement, pour entrer cette macro (SUB), alt-f11 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 et coller le code ci-dessous dans la fenêtre qui s'ouvre. Vous ferez quelque chose de similaire avec le module et le renommer à l'aide de la fenêtre . Pour utiliser cette macro (SUB), Alt-F8 Ouvre la boîte de dialogue Macro. Sélectionnez la macro par nom et Exécuter .


@ 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 .