我有一个旧DCS系统的数据点列表,我想迁移到一个更易于管理的组织(最好是csv)。我想将每个条目类型放入它自己的列中。最后,我还想在修改后的csv文件中将其转换回原始格式。这是几个条目的示例:从不同长度和列的数据列表创建csv
{SYSTEM ENTITY 95UA114() }
&T DIGINHG
&N 95UA114
UNIT = FD
PTDESC ="95C-101 COMPRESSOR S/D "
KEYWORD ="C101 S/D"
PRIMMOD = HPFD01G
ASSOCDSP ="HPFD01~1"
$CDETAIL =" "
HWYNUM = 08
PNTBOXTY = DHP
BOXNUM = 8
PTDISCL = FULL
LOADDEST = HG_HIWAY
SLOTNUM = 12
INPTSSLT = 10
NMBRINPT = 1
$AUXUNIT = --
$REALARM = 0
DIGALFMT = STATE2
DLYTIME = 0
CHOFSTPR = NOACTION
CNFERRPR = EMERGNCY
OFFNRMPR = EMERGNCY
CRITSCAN = OFF
CCRANK = NEITHER
EIPPCODE = --
EIPEVENT = ANY
EIPENB = ENABLE
ALENBST = ENABLE
STATE2 ="S/D_BYP "
STATE1 ="NORMAL "
UBOXCLR = RED
LBOXCLR = GREEN
OVERVAL = ON
INPTDIR = DIRECT
PNTBOXIN = 1
PNTPCTY = MODICON
PCADDRI1 = 2097
SPECIFI1 = 1
由于信息是多余的,因此不需要第一行(系统实体)。列(Unit,ptdesc)并不总是相同的。我打算使用autohotkey来做到这一点,但如果任何人有更好的建议,我全都听过。现在,我有了读取文件并分离每个实体的代码,并将=
中的每行分开以确定每列的值,但将它们排列起来证明是一个挑战。我能想到处理它的唯一方法是使用2d数组,但编写起来会很麻烦,而且我确信有更好/更有效的方法(因为该文件约为21k行/ 500个实体)。
numEntries = 0
AutoTrim, Off
outFile = test.csv
filedelete, %outfile%
filereadline, columns, columns.txt, 1
fileappend, TAG`,NAME`,%columns%`r`n, %outfile%
stringsplit, columns, columns,`,
numcolumns=%columns0%
msgbox %numcolumns%
Loop, Read, H3ALL.EB
{
ifinstring, A_LoopReadLine,=
{
i++
data%i%=%A_LoopReadLine%
continue
}
ifinstring, A_LoopReadLine,SYSTEM ENTITY
{
numEntries+=1
if(numEntries > 1)
{
fileappend,`r`n,%outfile%
Loop %i%
{
element := data%A_Index%
stringsplit, element, element,=
Loop %numcolumns%
{
test1=%element1%
test2:=columns%A_Index%
if (test1=test2)
{
;add to correct column
}
}
}
data=
i=0
}
continue
}
ifinstring, A_LoopReadLine,&T
{
stringsplit, line, A_LoopReadLine,%A_SPACE%
tag=%line2%
fileappend,%tag%`,,%outfile%
;msgbox the tag is %tag%
continue
}
ifinstring, A_LoopReadLine,&N
{
stringsplit, line, A_LoopReadLIne,%A_SPACE%
name=%line2%
fileappend,%name%`,, %outfile%
;msgbox the name is %name%
continue
}
}
msgbox DONE!
工作代码:
i=0
j=0
outFile = test.csv
filedelete, %outfile%
AutoTrim, off
filereadline, columns, columns.txt, 1
fileappend,%columns%`r`n,%outfile%
stringsplit, columns, columns,`,
numColumns=%columns0%
Loop, Read, H3ALL.EB
{
ifinstring, A_LoopReadLine,=
{
i++
stringsplit, line, A_LoopReadLine,=
loop %numColumns% {
test1:=columns%A_Index%
test2=%line1%
if(test1=test2) {
dataArray%A_Index%_%j%=%line2%
;msgbox column %test1% (%A_Index%) contains %line2%
}
}
continue
}
ifinstring, A_LoopReadLine,SYSTEM ENTITY
{
j++
i=0
continue
}
ifinstring, A_LoopReadLine,&T
{
i++
stringsplit, line, A_LoopReadLine,%A_SPACE%
dataArray%i%_%j%=%line2%
continue
}
ifinstring, A_LoopReadLine,&N
{
i++
stringsplit, line, A_LoopReadLIne,%A_SPACE%
dataArray%i%_%j%=%line2%
continue
}
}
outerIndex=0
Loop %j% {
outerIndex++
Loop %numColumns% {
cell:=dataArray%A_Index%_%outerIndex%
fileappend,%cell%`,,%outfile%
}
fileappend,`r`n,%outfile%
}
什么语言在您的处置? 使用perl或python字典,并且使用“eval”可以很好地解决问题,您可以拆分文件,然后对500个文件进行排序,然后在bash中使用“join”来获取(列为行) 如果您不知道任何脚本语言,请检查python或ruby,对于500条记录,它比手动执行包括夯实时间要短。 ---- – vish
请张贴您的代码。此外,什么标志着这种实体定义的结束?我认为这是一个'}'!?一个文件中是否包含多个实体? – MCL
我已将我的代码添加到操作。说实话,我唯一真正有经验的语言是autohotkey。它为一个旧工作服务的目的,我没有时间去尝试其他任何人,虽然我真的想获得一些perl的经验。 至于什么结束块,是“系统实体”行是我想知道我的当前块已完成的行。 – user2817021