3 votes

La boucle Foreach en C# crée toujours un nouveau fichier

Je voudrais créer une méthode qui crée un nouveau fichier pour chaque fournisseur.

Malheureusement, ma tentative ne fonctionne pas.

Il ne crée qu'un seul fichier.

 Ma liste contient
SupplierNr     NuméroPreuve
13245242       45519013979
50945724       45519104207
50851942       45519130964
50940487       45519139065
13496912       45519139000

Il devrait créer 5 fichiers et non pas un seul.

Ma méthode

StreamWriter sw;
int numerofichier = 1;
DateTime maintenant = DateTime.Now;
string nomfichier = $"C:\\Users\\pasca\\Desktop\\Test\\i.lle_alt.{maintenant.ToString("yyyyMMdd")}{numerofichier.ToString("D2")}";

foreach (string Fournisseur in FournisseursNr)
{
    int SPID = 0;

    sw = new StreamWriter(nomfichier);

    for (int ID = 0; ID < CustomerProduct.Count; ID++)
    {
        sw.WriteLine($"{CustomerProduct[ID]};{DateBegin};{DateEnd};{Fournisseur};{Origine[ID]};{NonPreference[ID]};{NuméroPreuve[SPID]};");
    }

    SPnr++;
    numerofichier++;
    sw.Close();
}

Pouvez-vous s'il vous plaît m'expliquer ce que je dois changer, car j'ai beaucoup cherché mais n'ai trouvé aucun exemple ou quelque chose pour ma question.

4voto

Mong Zhu Points 15038

Bien que vous incrémentez filenumber, vous ne mettez jamais à jour la variable filename à l'intérieur de la boucle.

Je suggérerais de créer une partie de nom de fichier de base qui est fixe (car elle ne change pas pendant l'itération) :

string filenameBase = $"C:\\Users\\pasca\\Desktop\\Test\\i.lle_alt.{now.ToString("yyyyMMdd")}"

et à l'intérieur de la boucle, changer seulement la partie finale

foreach (string Supplier in SuppliersNr)
{
    sw = new StreamWriter(filenameBase + filenumber.ToString("D2"));
    filenumber++;       
}

Vous pourriez même vous débarrasser de la variable supplémentaire filenumber en utilisant une boucle normale for. De cette façon, l'incrémentation se fera automatiquement :

for (int i = 0; i < SuppliersNr.Count; i++) //<- en supposant que SuppliersNr est une List
{
    sw = new StreamWriter(filenameBase + (i + 1).ToString("D2"));       
}

1voto

apomene Points 10350

Vous devez mettre la création du filename à l'intérieur de la boucle foreach. Essayez comme suit :

int filenumber = 1;
DateTime now = DateTime.Now;       
foreach (string Supplier in SuppliersNr)
{
  string filename = $"C:\\Users\\pasca\\Desktop\\Test\\i.lle_alt.{now.ToString("yyyyMMdd")}{filenumber.ToString("D2")}";
  filenumber ++;
....

1voto

Tomas Chabada Points 1183

filename est le même car vous le définissez lorsque filenumber était à 1.
Vous devez mettre à jour filename à l'intérieur de la boucle foreach :

foreach (string Supplier in SuppliersNr)
{
    int SPID = 0;
    filename = $"C:\\Users\\pasca\\Desktop\\Test\\i.lle_alt.{now.ToString("yyyyMMdd")}{filenumber.ToString("D2")}";

    sw = new StreamWriter(filename);

    for (int ID = 0; ID < CustomerProduct.Count; ID++)
    {
        sw.WriteLine($"{CustomerProduct[ID]};{DateBegin};{DateEnd};{Supplier};{Origin[ID]};{NonPreference[ID]};{ProofNr[SPID]};");
    }

    SPnr++;
    filenumber++;
    sw.Close();
}

0voto

Antoine V Points 5114

Vous devriez mettre le nom du fichier dans cette boucle, comme ceci:

            foreach (string Fournisseur in FournisseursNr)
            {
                string nomfichier = $"C:\\Users\\pasca\\Desktop\\Test\\i.lle_alt.{now.ToString("yyyyMMdd")}{numfichier.ToString("D2")}";
                sw = new StreamWriter(nomfichier);

                //votre logique
                //numfichier++;
            }

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