Last active
February 8, 2019 04:59
-
-
Save todorok1/8253c4df2db2bc1c60c562eda6ac0d0d to your computer and use it in GitHub Desktop.
CSVファイルをXMLファイルに変換する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(CsvToXmlConverter))] | |
public class CsvToXmlConverterEditor : Editor { | |
public override void OnInspectorGUI(){ | |
var csvToXmlConverter = target as CsvToXmlConverter; | |
DrawDefaultInspector(); | |
if (GUILayout.Button("XMLに変換")){ | |
ConvertCsvToXml(csvToXmlConverter); | |
} | |
} | |
void ConvertCsvToXml(CsvToXmlConverter csvToXmlConverter){ | |
// CSVファイルの参照を確認する | |
if (csvToXmlConverter.csvFile == null){ | |
Debug.LogWarning(csvToXmlConverter.name + " : 読み込むCSVファイルがセットされていません。"); | |
return; | |
} | |
// XMLファイル名の入力を確認する | |
if (string.IsNullOrEmpty(csvToXmlConverter.xmlFileName)){ | |
Debug.LogWarning(csvToXmlConverter.name + " : 出力するXMLファイル名が入力されていません。"); | |
return; | |
} | |
// 保存先を指定する | |
string outputPath = AssetDatabase.GetAssetPath(csvToXmlConverter); | |
outputPath = outputPath.Substring(0, outputPath.LastIndexOf(csvToXmlConverter.name)) + csvToXmlConverter.xmlFileName + ".xml"; | |
FileInfo fi = new FileInfo(outputPath); | |
StreamWriter sw = fi.CreateText(); | |
// XMLファイルの宣言部分を作成 | |
string xmlRoot = "Root"; | |
XDocument doc = new XDocument( | |
new XDeclaration("1.0", "utf-8", "yes"), | |
new XElement(xmlRoot, null) | |
); | |
XElement rootElem = doc.Element(XName.Get(xmlRoot)); | |
try { | |
// csvファイルをstring形式に変換して改行で分割する | |
string csvText = csvToXmlConverter.csvFile.text; | |
string[] afterParse = csvText.Split('\n'); | |
// ヘッダー行をXML要素のタグとして配列に格納 | |
string[] headerElements = afterParse[0].Split(','); | |
// ヘッダー行以外をXML要素の値としてオブジェクトを生成 | |
for (int i = 1; i < afterParse.Length; i++){ | |
string[] parseByComma = afterParse[i].Split(','); | |
// 先頭の列が空であればその行は読み込まない | |
if (parseByComma[0] == ""){ | |
continue; | |
} | |
// 各行をタグでまとめる | |
string childRoot = "Data"; | |
XElement childElem = new XElement(childRoot); | |
for (int column = 0; column < parseByComma.Length; column++){ | |
childElem.Add(new XElement(headerElements[column], parseByComma[column])); | |
} | |
rootElem.Add(childElem); | |
} | |
} catch (System.Exception e){ | |
Debug.LogError(e.Message); | |
Debug.LogError("CSVファイルの解析に失敗しました。正しいCSVファイルが参照されていることを確認してください。"); | |
return; | |
} | |
doc.Save(sw); | |
// プロジェクト内のアセットの表示を更新する | |
AssetDatabase.Refresh(); | |
Debug.Log("変換完了!"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment