XMLファイルをCSVファイルに変換するEditor拡張
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
using UnityEditor; | |
using System.IO; | |
using System.Xml.Linq; | |
[CustomEditor(typeof(XmlToCsvConverter))] | |
public class XmlToCsvConverterEditor : Editor { | |
public override void OnInspectorGUI(){ | |
var xmlToCsvConverter = target as XmlToCsvConverter; | |
DrawDefaultInspector(); | |
if (GUILayout.Button("CSVに変換")){ | |
try { | |
ConvertXmlToCsv(xmlToCsvConverter); | |
} catch (System.Exception e){ | |
Debug.LogError(e.Message); | |
Debug.LogError("XMLファイルの解析に失敗しました。正しいXMLファイルが参照されていることを確認してください。"); | |
} | |
} | |
} | |
void ConvertXmlToCsv(XmlToCsvConverter xmlToCsvConverter){ | |
// XMLファイルの参照を確認する | |
if (xmlToCsvConverter.xmlFile == null){ | |
Debug.LogWarning(xmlToCsvConverter.name + " : 読み込むXMLファイルがセットされていません。"); | |
return; | |
} | |
// CSVファイル名の入力を確認する | |
if (string.IsNullOrEmpty(xmlToCsvConverter.csvFileName)){ | |
Debug.LogWarning(xmlToCsvConverter.name + " : 出力するCSVファイル名が入力されていません。"); | |
return; | |
} | |
// XMLファイルを解析する | |
string xmlText = xmlToCsvConverter.xmlFile.text; | |
XDocument doc = XDocument.Parse(xmlText); | |
XElement rootElem = doc.Root; | |
var dataElements = rootElem.Elements(); | |
// 最初の子要素からカラム名を取得する | |
List<string> columns = new List<string>(); | |
foreach (var sample in dataElements){ | |
foreach (var sampleElem in sample.Elements()){ | |
if (!columns.Contains(sampleElem.Name.LocalName)){ | |
columns.Add(sampleElem.Name.LocalName); | |
} | |
} | |
break; | |
} | |
// 保存先を指定する | |
string outputPath = AssetDatabase.GetAssetPath(xmlToCsvConverter); | |
outputPath = outputPath.Substring(0, outputPath.LastIndexOf(xmlToCsvConverter.name)) + xmlToCsvConverter.csvFileName + ".csv"; | |
FileInfo fi = new FileInfo(outputPath); | |
StreamWriter sw = fi.CreateText(); | |
// ヘッダー行をファイルに出力する | |
string[] columnArray = columns.ToArray(); | |
sw.WriteLine(string.Join(",", columnArray)); | |
// データ行をファイルに出力する | |
foreach (var dataElement in dataElements){ | |
// タグの名前とデータの辞書を作る | |
Dictionary<string, string> dataDict = new Dictionary<string, string>(); | |
foreach (string tag in columnArray){ | |
dataDict.Add(tag, ""); | |
} | |
// 辞書の対応するタグにデータを格納する | |
foreach (var element in dataElement.Elements()){ | |
dataDict[element.Name.LocalName] = element.Value; | |
} | |
// 辞書のデータをカラム配列の順番で格納したあと、データ行を配列に変換する | |
List<string> dataInLine = new List<string>(); | |
foreach (string tag in columnArray){ | |
dataInLine.Add(dataDict[tag]); | |
} | |
string[] dataArray = dataInLine.ToArray(); | |
sw.WriteLine(string.Join(",", dataArray)); | |
} | |
// ファイルアクセスを閉じる | |
sw.Flush(); | |
sw.Close(); | |
// プロジェクト内のアセットの表示を更新する | |
AssetDatabase.Refresh(); | |
Debug.Log("CSVへの変換が完了!"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment