想知道是否有一个易于将结构化文件转换为Doctrine / Symfony的YAML数据夹具。
我没有看到Doctrine接受CSV的任何实用程序。
我可能只是开始写一些简单的事情来做这件事。值得吗?
答案 0 :(得分:10)
我写了自己的宏来解决这个问题&分享了它。您可以指定模型中的字段,填写数据并生成YAML。 最好的部分是它支持嵌套数据(基于NestedSet Doctrine Behavior)
您可以从此处下载文件: http://www.prasadgupte.com/go/converting-csvexcel-data-to-doctrine-yaml-fixtures/
希望这有帮助!
答案 1 :(得分:3)
快速谷歌搜索提出了这个问题:http://code.activestate.com/recipes/546518-simple-conversion-of-excel-files-into-csv-and-yaml/
虽然需要Python,但这应该不是问题。看起来非常有前途,并且完全符合您的需求(请记住,CSV文件可以像excel一样使用excel文件打开并保存为.xls)
答案 2 :(得分:1)
如果您已在使用转换宏,则可以添加一个将从CSV数据创建PHP脚本的函数。所以对象“Pen”的数据行如下: 名称类型价格
Pen Name, Type, Price
"Reyballs Super Point 0.5", "Ball point", 10
"Palkar Ink Pen", "Ink Pen", 25
会输出:
// Object: Pen
$pen1 = new Pen();
$pen1->name = "Reyballs Super Point 0.5";
$pen1->type = "Ball point";
$pen1->price = "10";
$pen1->save();
unset($pen1);
$pen2 = new Pen();
$pen2->name = "Palkar Ink Pen";
$pen2->type = "Ink Pen";
$pen2->price = "25";
$pen2->save();
unset($pen2);
这是宏功能:
Sub GeneratePHP()
targetSheetRow = 1
fieldNamesRow = 3
sourceSheetDataRow = fieldNamesRow + 1
earlyLoopEnd = False
counter = 0
' do not run without active sheet
If ActiveSheet.Name = "" Then
MsgBox "Please call the macro from a sheet"
End
End If
' identify sheets
Set source = ActiveSheet
' custom output sheet
targetSheetName = source.Cells(1, 12)
If targetSheetName = "" Or targetSheetName = "Output" Then
targetSheetName = "Output"
Else
On Error GoTo RTE
Set Target = Worksheets(targetSheetName)
GoTo RTS
RTE:
'MsgBox "PG" & Err.Description, Title:=Err.Source
targetSheetName = "Output"
End If
RTS:
' clear exsiting data in Target/Output sheet
Set Target = Worksheets(targetSheetName)
Target.Cells.Clear
Target.Cells.Font.Name = "Courier"
' Get no of fields in model (assume level & key always there)
noOfCols = 2
Do While source.Cells(fieldNamesRow, noOfCols + 1) <> "end"
noOfCols = noOfCols + 1
Loop
' If no field other than level & key, error
If noOfCols < 3 Then
MsgBox "No data for the records"
End
End If
' print Model name
Target.Cells(targetSheetRow, 1) = "// Object: " + source.Cells(1, 4)
targetSheetRow = targetSheetRow + 1
objClass = source.Cells(1, 4)
' Loop over data rows in source sheet
Do While source.Cells(sourceSheetDataRow, 1) <> "end"
If source.Cells(sourceSheetDataRow, 1) = "end-loop" Then
Target.Cells(targetSheetRow, 1) = "<?php endfor; ?>"
targetSheetRow = targetSheetRow + 1
earlyLoopEnd = True
GoTo NextRow
End If
' rows to skip
If source.Cells(sourceSheetDataRow, 2) = "~!~" Or source.Cells(sourceSheetDataRow, 1) = "~!~" Then
GoTo NextRow
End If
' read level
blanks = source.Cells(sourceSheetDataRow, 1)
' print key
counter = counter + 1
varName = "$" + LCase(objClass) + CStr(counter)
varDec = varName + " = new " + objClass + "();"
Target.Cells(targetSheetRow, 1) = varDec
targetSheetRow = targetSheetRow + 1
spaces = spaces + " "
spaces_count = spaces_count + 2
' print fields when value != ~!~
For clNumber = 3 To noOfCols
If CStr(source.Cells(sourceSheetDataRow, clNumber)) <> "~!~" And CStr(source.Cells(fieldNamesRow, clNumber)) <> "~!~" Then
Target.Cells(targetSheetRow, 1) = varName + "->" + source.Cells(fieldNamesRow, clNumber) + " = """ + CStr(source.Cells(sourceSheetDataRow, clNumber)) + """;"
targetSheetRow = targetSheetRow + 1
End If
Next clNumber
Target.Cells(targetSheetRow, 1) = varName + "->save();"
targetSheetRow = targetSheetRow + 1
Target.Cells(targetSheetRow, 1) = "unset(" + varName + ");"
targetSheetRow = targetSheetRow + 1
NextRow:
' go for next row in source sheet
sourceSheetDataRow = sourceSheetDataRow + 1
Loop
' Success
msg = "Data from sheet """ & source.Name & """ was converted to YAML on """ & targetSheetName & """ sheet" & vbCrLf & vbCrLf & "prasadgupte.com"
MsgBox msg
' Focus on output sheet
Sheets(targetSheetName).Select
Range("A1:A" & (targetSheetRow - 1)).Select
End Sub
答案 3 :(得分:1)
您可以尝试Data Transformer(免责声明-我是它的开发者)。可以在本地CSV,JSON,XML和YML之间进行转换。
它具有许多转换设置(默认设置很好),因此您可以根据自己的目的定制结果。
您可以从Mac App Store或Microsoft Store中获得它。
没有试用版,但是如果不适合您,您可以要求Apple或Microsoft退款!