Skip to content

Instantly share code, notes, and snippets.

@todorok1
Last active February 9, 2019 05:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save todorok1/967f1dd146b0b368983b82f680e9ed4b to your computer and use it in GitHub Desktop.
Save todorok1/967f1dd146b0b368983b82f680e9ed4b to your computer and use it in GitHub Desktop.
XMLファイルをCSVファイルに変換するEditor拡張
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