2017-02-15 17 views
1

Das Problem:Metadaten exportieren aus einer benutzerdefinierten Registerkarte aus den Dateieigenschaften für eine Liste von Dateien in Unterordner

auf meinem Windows-Dateiserver habe ich rund 1.000.000 Solidworks Dateien, die Metadaten in den Dateieigenschaften unter einem benutzerdefinierten haben Registerkarte (siehe Bild unten), die ich in eine einzelne CSV-Datei exportieren möchte.

Custom Tab image

Diese Dateien werden in Unterbaum von Ordnern befinden, und mit anderen Dateitypen.

Die Lösung:

Ein Skript nur bestimmte Dateitypen Ziel benötigt wird (Erweiterungen) in einem Teilbaum des Ordners exportiert, dass die Metadaten aus dem benutzerdefinierten Register in eine CSV-Datei, wo ich kann, Bereinigen Sie dann und importieren Sie die Daten in eine SQL-Datenbank.

Ich bin mir nicht sicher, der beste Weg, dies zu erreichen, ich dachte entlang der Linien von PowerShell, jede Hilfe, um loszulegen würde sehr geschätzt werden.

Antwort

2

Wenn Sie eine .NET-Sprache wie C# oder Visual Basic verwenden, können Sie die SolidWorks API und die Document Manager-Bibliotheken verwenden (Sie benötigen eine kostenlose Lizenz mit Ihrem Abonnement über das Kundenportal) Informationen ohne Öffnen der Dateien. Es ist ziemlich schnell. Wenn Sie nur bestimmte Dateien betrachten, ist das mit .NET IO.Path.GetExtension problemlos möglich.

Unten ist ein funktionierendes Beispiel von dem, was ich denke, dass Sie suchen.

Sie benötigen die Document Manager-DLL, die sich auf dem SolidWorks API SDK befindet, das auf dem Installationsmedium enthalten ist. Sie können dann auf SolidWorks.Interop.swdocumentmgr.dll verweisen.

Sie benötigen auch eine Dokument-Manager-Seriennummer, die Sie mit Ihrem SolidWorks-Abonnement kostenlos über das SolidWorks Kundenportal anfordern können. Sobald Sie diese Nummer haben, ersetzen Sie den Wert für die lic-Zeichenfolge durch die gesamte Seriennummer in Anführungszeichen.

Um zu definieren, welche benutzerdefinierten Eigenschaften aus den SolidWorks-Dateien gelesen werden sollen, ändern Sie einfach die Liste propertiesToRead, um alle Werte einzubeziehen, die Sie abrufen müssen. Dies ist NICHT Groß-und Kleinschreibung.

Wenn Sie dies ausführen, werden Sie aufgefordert, einen Verzeichnispfad einzugeben. Hier wird auch die Datei Output.csv erstellt.

Unten ist ein Screenshot der Probenergebnisse zu sehen.

using SolidWorks.Interop.swdocumentmgr; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 

namespace WriteProperties 
{ 
    class Program 
    { 
     static ISwDMApplication4 docManager; 
     static List<string> propertiesToRead = new List<string>() { "Number", "Description", "Revision", "Material", "Finish", "Weight" }; 
     const string lic = "YOU CAN GET THIS NUMBER FROM THE CUSTOMER PORTAL WITH YOUR SOLIDWORKS SUBSCRIPTION AT NO COST"; 

     static char[] charactersToQuote = { ',', '"', '\n' }; 
     const string QUOTE = "\""; 
     const string QUOTEFORMATTED = "\"\""; 


     static void Main(string[] args) 
     { 
      string directoryPath = GetDirectory(args); 

      if (string.IsNullOrEmpty(directoryPath)) return; 

      if (!LoadDocManager()) return; 

      string outputPath = Path.Combine(directoryPath, "Output.csv"); 

      StringBuilder sb = new StringBuilder(); 
      sb.AppendLine("File Name," + string.Join(",", propertiesToRead)); 

      int counter = 0; 

      foreach (string filePath in Directory.EnumerateFiles(directoryPath, "*.sld*", SearchOption.AllDirectories)) 
      { 
       SwDMDocument21 dmDocument = GetDocument(filePath); 
       if (dmDocument == null) continue; 

       WriteProperties(sb, dmDocument, filePath); 
       counter++; 
      } 

      File.WriteAllText(outputPath, sb.ToString()); 

      Console.WriteLine("{0} files read and saved to {1}", counter, outputPath); 
      Console.ReadLine(); 
     } 

     static string GetDirectory(string[] args) 
     { 
      if (args != null && args.Count() > 0 && Directory.Exists(args[0])) return args[0]; 

      Console.WriteLine("Directory to read:"); 
      string filePath = Console.ReadLine(); 

      if (Directory.Exists(filePath)) return filePath; 

      Console.WriteLine("Directory does not exists: {0}", filePath); 
      return string.Empty; 
     } 

     static bool LoadDocManager() 
     { 
      if (docManager != null) return true; 

      try 
      { 
       SwDMClassFactory factory = new SwDMClassFactory(); 
       if (factory == null) throw new NullReferenceException(nameof(SwDMClassFactory)); 

       docManager = (SwDMApplication4)factory.GetApplication(lic); 
       if (docManager == null) throw new NullReferenceException(nameof(SwDMApplication4)); 

       return true; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Document Manager failed to load: {0}", ex.Message); 
       Console.ReadLine(); 
       return false; 
      } 
     } 

     static SwDMDocument21 GetDocument(string filePath) 
     { 
      SwDmDocumentType documentType = GetDocType(filePath); 
      if (documentType == SwDmDocumentType.swDmDocumentUnknown) return null; 

      SwDmDocumentOpenError result = SwDmDocumentOpenError.swDmDocumentOpenErrorNone; 
      SwDMDocument21 dmDocument = (SwDMDocument21)docManager.GetDocument(filePath, documentType, true, out result); 

      if (result == SwDmDocumentOpenError.swDmDocumentOpenErrorNone || result == SwDmDocumentOpenError.swDmDocumentOpenErrorFileReadOnly) return dmDocument; 

      if (dmDocument != null) dmDocument.CloseDoc(); 

      return null; 
     } 

     static SwDmDocumentType GetDocType(string filePath) 
     { 
      if (filePath.Contains("~$")) return SwDmDocumentType.swDmDocumentUnknown; 

      switch (Path.GetExtension(filePath).ToLower()) 
      { 
       case ".sldprt": return SwDmDocumentType.swDmDocumentPart; 
       case ".sldasm": return SwDmDocumentType.swDmDocumentAssembly; 
       case ".slddrw": return SwDmDocumentType.swDmDocumentDrawing; 
       default: return SwDmDocumentType.swDmDocumentUnknown; 
      } 
     } 

     static void WriteProperties(StringBuilder sb, SwDMDocument21 dmDocument, string filePath) 
     { 
      Console.WriteLine("Reading {0}", filePath); 

      List<string> propertiesInFile = new List<string>(); 

      if (dmDocument.GetCustomPropertyCount() > 0) propertiesInFile.AddRange(dmDocument.GetCustomPropertyNames()); 

      string csvLine = filePath; 

      foreach (string property in propertiesToRead) 
      { 
       string propertyValue = ""; 

       if (propertiesInFile.Any(s => string.Compare(s, property, true) == 0)) 
       { 
        SwDmCustomInfoType propertyType = SwDmCustomInfoType.swDmCustomInfoText; 

        string resolvedValue; 

        propertyValue = dmDocument.GetCustomPropertyValues(property, out propertyType, out resolvedValue); 
       } 

       csvLine = csvLine + "," + FixChars(propertyValue); 
      } 

      sb.AppendLine(csvLine); 

      dmDocument.CloseDoc(); 
     } 

     static string FixChars(string s) 
     { 
      if (s.Contains(QUOTE)) s = s.Replace(QUOTE, QUOTEFORMATTED); 

      if (s.IndexOfAny(charactersToQuote) > -1) s = QUOTE + s + QUOTE; 

      return s; 
     } 

    } 
} 

Hier ist ein Beispiel für die Ausgabe enter image description here

+0

plus eins für die Antwort –

Verwandte Themen