如何在CSV文件中使用正则表达式更改数据列的位置?

0 投票
1 回答
656 浏览
提问于 2025-04-18 14:57

我快要放弃了,截止日期快到了。今年夏天我报了个正则表达式的课程(我人生中最大的错误),我们有一个项目(选择一个旧软件进行更新),我几乎完成了所有的工作,但就是这个,我有一个关于怪物属性的数据库的.txt文档。

总之,逻辑是每个变量代表一列/键,每列之间用逗号分隔。我们需要使用任何可用的工具来删除、添加或重新排列这些列(正则表达式是我唯一知道可以帮忙的工具,你知道其他方法吗?)

这是旧的格式:

ID,Name,JName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ADelay,aMotion,dMotion,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,MEXP,ExpPer,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per

第一步,删除最后的第七列(删除所有ExpPer条目):

结果是:
ID,Name,JName,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ADelay,aMotion,dMotion,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,MEXP,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per

第二步,将JName列复制到下一个列:

结果是:
ID,Name,JName,Jname,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ADelay,aMotion,dMotion,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,MEXP,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per

第三步,将最后的7列移动到第31列开始的位置,也就是把...,dMotion,Drop1id,Drop1per,...移到...,dMotion,MEXP,...,MVP3per,Drop1id,...

结果是:
ID,Name,JName,Jname,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ADelay,aMotion,dMotion,MEXP,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per

第四步,最后,在最后添加这些列:,0,0,DONE,1

结果是:
ID,Name,JName,Jname,LV,HP,SP,EXP,JEXP,Range1,ATK1,ATK2,DEF,MDEF,STR,AGI,VIT,INT,DEX,LUK,Range2,Range3,Scale,Race,Element,Mode,Speed,ADelay,aMotion,dMotion,MEXP,MVP1id,MVP1per,MVP2id,MVP2per,MVP3id,MVP3per,Drop1id,Drop1per,Drop2id,Drop2per,Drop3id,Drop3per,Drop4id,Drop4per,Drop5id,Drop5per,Drop6id,Drop6per,Drop7id,Drop7per,Drop8id,Drop8per,0,0,DONE,1

所以,如果我运行任何正则表达式的搜索/替换工具,
原始数据是:

1052,ROCKER,Rocker,9,198,0,20,16,1,24,29,5,10,1,9,18,10,14,15,10,12,1,4,22,129,200,1864,864,540,940,5000,909,5500,2298,4,1402,80,520,10,752,5,703,3,4021,10,0,0,0,0,0,0,0,0

结果会是:

1052,ROCKER,Rocker,Rocker,9,198,0,20,16,1,24,29,5,10,1,9,18,10,14,15,10,12,1,4,22,129,200,1864,864,540,0,0,0,0,0,0,0,940,5000,909,5500,2298,4,1402,80,520,10,752,5,703,3,4021,10,0,0,DONE,1

希望有人能帮我,这个旧数据库的.txt文件里有500多个怪物。

谢谢!

1 个回答

0

微软Excel有一个叫做文本导入向导的工具,可以把任何文本文件中的CSV格式数据导入到空的Excel工作表里。这个向导适合用来处理小的CSV文件,导入数据后,你可以删除、移动或复制数据列,最后再把修改后的数据以CSV格式保存到文件中。

不过这里讨论的是如何用文本编辑器和正则表达式来重新格式化CSV文件。

我使用的是UltraEdit v21.20,并选择了Perl正则表达式引擎,但下面的方法应该适用于任何支持Perl正则表达式的文本编辑器。这些正则表达式的搜索和替换字符串在Python中也能使用。

重要提示:
下面的正则表达式只在CSV文件中没有双引号包裹的逗号值时有效。

第一步,删除最后的第7列(删除所有ExpPer条目):

搜索: ,[^,\r\n]*?(,(?:[^,\r\n]*?,){5}[^,\r\n]*)$
替换: \1

第二步,将JName列复制到下一个列:

搜索: ^((?:[^,\r\n]*?,){2})([^,\r\n]*?,)
替换: \1\2\2

第三步,把最后的7列提到第31列开始的位置:

搜索: ^((?:[^,\r\n]*?,){30})((?:[^,\r\n]*?,){15}[^,]*?),((?:[^,\r\n]*?,){6}[^,\r\n]*)$
替换: \1\3,\2

第四步,最后,在末尾添加,0,0,DONE,1

搜索: (.)$
替换: \1,0,0,DONE,1

不过这四个替换也可以用一个正则表达式来完成:

搜索: ^((?:[^,\r\n]*?,){2})([^,\r\n]*?,)((?:[^,\r\n]*?,){26})((?:[^,\r\n]*?,){16})([^,\r\n]*?,)[^,\r\n]*?,((?:[^,\r\n]*?,){5}[^,\r\n]*)$
替换: \1\2\2\3\5\6,\40,0,DONE,1

撰写回答