2017-02-15 10 views
1

問題:私のWindowsファイルサーバー上メタデータのエクスポート

私は、カスタムの下で、ファイルのプロパティでメタデータを持って周り1,000,000 SolidWorksファイルを持っています1つのCSVファイルにエクスポートしたい(下記の画像を参照)。

Custom Tab image

これらのファイルは、フォルダのサブツリーに位置し、他のファイルタイプと混合されています。

ソリューション:

スクリプトのみに必要とされているが、私ができる、CSVファイルにカスタムタブからメタデータをエクスポートしたフォルダのサブツリーに特定のファイルの種類(拡張子)を標的そのデータをクリーンアップしてSQLデータベースにインポートします。

これを達成するための最良の方法がわかりません。私はPowerShellのラインに沿って考えていましたが、今後はどのような助けになるか大いに感謝しています。

答えて

2

C#やVisual Basicなどの.NET言語を使用する場合は、SolidWorks APIとDocument Managerライブラリを使用できます(ライセンスを取得し、カスタマーポータルからサブスクリプションで無料にする必要があります)情報をファイルを開くことなく。それはかなり速いです。特定のファイルだけを見ると、それは.NET IO.Path.GetExtensionで簡単です。

以下は、私があなたが探しているものの実例です。

インストールメディアに含まれているSolidWorks API SDKにあるDocument Manager dllが必要です。 SolidWorks.Interop.swdocumentmgr.dllを参照することができます。

SolidWorks SubscriptionでSolidWorksカスタマーポータルから無償でリクエストできるDocument Managerシリアルナンバーも必要です。その番号を取得したら、下の文字列の値を引用符で囲んだシリアル番号全体に置き換えます。

SolidWorksファイルから読み取るカスタムプロパティを定義するには、リストpropertiesToReadを変更して、検索する必要がある値をすべて含めます。大文字と小文字は区別されません。

これを実行すると、ディレクトリパスを入力するよう求められます。 Output.csvファイルも作成されます。

サンプル結果のスクリーンショットです。ここで

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

    } 
} 

は答えのためのサンプル出力 enter image description here

+0

プラス1であります –