2016-12-23 5 views
0

Ich versuche, eine Importdatei basierend auf einer Liste von Dateien in einem Verzeichnis zu erstellen. Das Problem ist jetzt, dass ich aufgefordert wurde, den Wert eines der Ausgabeverzeichnisse basierend auf einem bestimmten Teil des Dateinamens zu erhöhen.Inkrementieren einer Variablen basierend auf einer analysierten Spalte aus einer Liste von Dateien in einem Verzeichnis

Unter dem LinkName ist fest codiert Full Image_0. Ich möchte es tatsächlich mehr wie LinkName = "Full Image_" + intXYZ.toString();

intXYZ wäre eine Variable, die bei 0 beginnt und um 1 für jede Datei mit identischen PartNums geht. Hier

ist relevant Code:

ImageName = Directory.GetFiles(@"\\192.168.0.144\iApps_Final_Images\ProductImages\", "*.*", SearchOption.AllDirectories); 

ImageItem = Directory.GetFiles(@"\\192.168.0.144\iApps_Final_Images\ProductImages\", "*.*", SearchOption.AllDirectories).Select(file => Path.GetFileNameWithoutExtension(file)).ToArray(); 

// Set path for output file and open 
FilePath = @"\\vhome\public\p21\Images.txt"; 
var writer = new StreamWriter(FilePath); 

// Go through each file found (not named thumbs) and output row of data needed for inv_mast_links import 

foreach (var item in ImageName) 
    { 
    SetNum = SetNum + 1; 
    LinkPath = item.ToString(); 
    PartNum = ImageItem[SetNum - 1].ToString().Split('_').Last(); 
    LinkName = "Full Image_0"; 
    var line = SetNum + delimiter + PartNum + delimiter + LinkName + delimiter + LinkPath + delimiter + "Item Maintenance"; 
    if (PartNum != "Thumbs") 
     { 
     writer.WriteLine(line); 
     } 
    } 

// Close the output file 
writer.Close(); 

Beispiel: Wenn Dateien im Verzeichnis sind: TVImage_567.jpg, FrontView_888.jpg, BackView_888.jpg dann da zwei der Bilder für die gleichen PartNum von 888 sind die gewünschten drei LinkName Ausgänge wären : Full Image_0, Full Image_0, Full Image_1.

+0

Ihr Beispiel ist nicht klar. Bitte erläutern Sie ein bisschen mehr. – DarkKnight

+0

Laut Ihrem Code gibt es einige Dateien mit dem Namen 'something_Thumbs', ist das korrekt? Obwohl es für das eigentliche Problem nicht relevant ist, ist es verwirrend, weil Ihre Variable/Eigenschaft "PartNum" heißt und tatsächlich ein Wort sein könnte. Sie sollten immer den Typ der Variablen angeben, für die Sie die Initialisierung nicht angegeben haben. Macht die Sache klarer. – Mat

Antwort

0

Wenn ich Ihre Frage richtig verstanden ist, was Sie wollen:

Dictionary<string, Integer> counts = new Dictionary<string, Integer>(); 

foreach (var item in ImageName) 
{ 
    SetNum = SetNum + 1; 
    LinkPath = item.ToString(); 
    PartNum = ImageItem[SetNum - 1].ToString().Split('_').Last(); 
    if (counts.ContainsKey(PartNum)) { 
     counts[PartNum]++; 
    } 
    else 
    { 
     counts.Add(PartNum, 0); 
    } 
    LinkName = "Full Image_" + counts[PartNum]; 
    var line = SetNum + delimiter + PartNum + delimiter + LinkName + delimiter + LinkPath + delimiter + "Item Maintenance"; 
    if (PartNum != "Thumbs") 
    { 
     writer.WriteLine(line); 
    } 
} 

Es ist nicht ganz klar, was SetNum nicht so dass ich es nur dort gelassen. Die Idee ist einfach, die "Nummer" des vorherigen Elements zu speichern und einen Zähler zu erhöhen, bis die tatsächliche "Nummer" nicht der vorherigen entspricht.

+0

Näher, aber Dateinamen haben keine Garantie der Sortierreihenfolge ... – Bert

+0

Hier verwenden wir diese Beispieldaten, die Dateinamen sind: FrontView_888.jpg, TV_567.jpg, VCR_254.jpg, BackView_888.jpg, Stereo_46.jpg, SideView_888.jpg Dann wären die resultierenden LinkNames: Volles Bild_0, Volles Bild_0, Volles Bild_0, Volles Bild_1, Volles Bild_0, Volles Bild_2 – Bert

+0

@Bert dann wirst du eine 'map' verwenden wollen – Mat

0

Wie wäre es damit, Sie brauchen keine SetNum benötigen

 string[] ImageNames = Directory.GetFiles(@"Source-Directory\", "*.*", SearchOption.AllDirectories); 

     string[] ImageItem = ImageNames.Select(file => Path.GetFileNameWithoutExtension(file)).ToArray(); 

     string FilePath = @"Destination.txt"; 
     using (var writer = new StreamWriter(FilePath)) 
     { 
      for (int i = 1; i < ImageNames.Length - 1; i++) 
      { 
       string LinkPath = ImageNames[i].ToString(); 
       string PartNum = ImageItem[i - 1].ToString().Split('_').Last(); 

       string LinkName = "Full Image_" + i; 
       var line = i + delimiter + PartNum + delimiter + LinkName + delimiter + LinkPath + delimiter + "Item Maintenance"; 
       if (PartNum != "Thumbs") 
       { 
        writer.WriteLine(line); 
       } 
      } 
     } 
+0

Würde nicht, Full Image_ # würde einfach immer hochzählen und ich brauche es IMMER Null zu sein, NUR wenn PartNum schon eine Null hat, dann muss es 1 sein, außer es hat schon 1, etc ... – Bert

Verwandte Themen