2 votes

Écrire des colonnes de longueurs inégales en CSV

J'ai désérialisé en C# un fichier JSON avec la structure de données suivante

[DataContract]
public class SentimentData
{
    [DataMember(Name ="Column1")]
    public IEnumerable<string> Column1 { get; set; }

    [DataMember(Name ="Column-2")]
    public IEnumerable<string> Column2 { get; set; }
}

Le compte de la colonne 1 n'est pas égal au compte de la colonne 2. Je veux juste vider toutes les données de la colonne 1 dans la première colonne et les données de la colonne 2 dans la deuxième colonne. J'ai essayé ce qui suit mais cela ne fonctionne pas.

using (var writer = new StreamWriter(@"C:\test.csv"))
{
    var nr = column1data.Select(y => new { Column1= y }).ToList();
    //var nnr = column2data.Select(y => new { Column2 = y }).ToList();

    var csv = new CsvWriter(writer);
    csv.WriteRecords(nr);
    //csv.WriteRecords(nnr);
    writer.Flush();
}

Quelqu'un peut-il savoir comment faire ?

échantillon json :

{
  "Negative": [
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt"
  ],
  "Non-Negative": [
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt",
    "a.txt",
    "b.txt"
  ]
}

3voto

Nkosi Points 95895

Voici une version modifiée du code pour la version par défaut de l'interface. Enumerable.Zip

L'extension suivante est dérivée pour permettre le zippage de collections de longueurs inégales

public static class MyEnumerablExtensions {

    public static IEnumerable<TResult> ZipOrDefault<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector) {
        if (first == null) throw Error.ArgumentNull("first");
        if (second == null) throw Error.ArgumentNull("second");
        if (resultSelector == null) throw Error.ArgumentNull("resultSelector");
        using (IEnumerator<TFirst> e1 = first.GetEnumerator()) {
            using (IEnumerator<TSecond> e2 = second.GetEnumerator()) {
                while (e1.MoveNext()) {
                    if (e2.MoveNext()) {
                        yield return resultSelector(e1.Current, e2.Current);
                    } else {
                        yield return resultSelector(e1.Current, default(TSecond));
                    }
                }
                while (e2.MoveNext()) {
                    yield return resultSelector(default(TFirst), e2.Current);
                }
            }
        }
    }
    class Error {
        public static Exception ArgumentNull(string parameter) {
            return new ArgumentNullException(parameter);
        }
    }
}

Cela vous permettra de construire le modèle d'objet souhaité qui pourra ensuite être écrit dans le rédacteur CSV.

using (var writer = new StreamWriter(@"C:\test.csv")) {
    var records = column1data.ZipOrDefault(column2data, 
        (Column1, Column2) => new { Column1, Column2 });

    var csv = new CsvWriter(writer);
    csv.WriteRecords(records);
    writer.Flush();
}

-1voto

Praneet Nadkar Points 690

Essayez newtonsoft json.net

Installez-le comme suit

install-package newtonsoft.json

Cela fonctionne pour moi :

static class Program
{
   static void Main()
   {
            var json = "{ \"Negative\": [ \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\" ], \"Non-Negative\": [ \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\", \"a.txt\", \"b.txt\" ] }";
            var classObject = JsonConvert.DeserializeObject<RootObject>(json);
    }
}

public class RootObject
{
   public List<string> Negative { get; set; }

   [JsonProperty("Non-Negative")]
   public List<string> NonNegative { get; set; }
}}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X