Skip to content

Instantly share code, notes, and snippets.

@todorok1
Last active February 8, 2019 04:59
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/8253c4df2db2bc1c60c562eda6ac0d0d to your computer and use it in GitHub Desktop.
Save todorok1/8253c4df2db2bc1c60c562eda6ac0d0d to your computer and use it in GitHub Desktop.
CSVファイルをXMLファイルに変換するEditor拡張のサンプル
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