我正在编写一些代码,从大型机获取报告并将其转换为电子表格。
他们无法编辑 MF 上的代码来给我一个带分隔符的文件,所以我只能将其作为固定宽度处理。
它现在工作正常,但在发布它进行测试之前我需要让它更稳定。
我的问题是,在任何给定的数据行中,假设它可能有三列数字,每列在位置 10、16 和 22 处有五个字符宽。如果在这一特定行上,最后两个没有数据cols,它不会用空格填充;相反,字符串的长度将只有 14。所以,我不能盲目地拥有
dim s as string = someStream.readline
a = s.substring(10, 5)
b = s.substring(16, 5)
c = s.substring(22, 5)
因为当它的子字符串超过字符串的长度时它会阻塞。
我知道我可以在处理每一行之前测试字符串的长度,并且我已经使用计数器和循环自动填充一些 vsariables,并使用 counter*theWidthOfTheGivenVariable 来跳来跳去,但这个项目一开始就是狗(来吧!把报告变成电子表格?),但是有许多不同类型的行(它不仅仅是一个网格),而且代码变得越来越丑陋。对于在我之后得到它的可怜傻瓜,我希望它是干净、清晰和可维护的。
如果重要,here's my code so far (目前真的很糟糕)。你可以在 processSection#data subs 中看到我/它的一些白痴
所以,我想知道
1) .NET 中是否有一种方法可以让 string.substring 在读取超过字符串结尾而不将其包装在 try...catch 中时不出错?
和
2) 在这种情况下编写一个新的字符串类是否合适,该类继承自具有更友好的子字符串函数的字符串?
ETA:感谢大家提供的所有建议和知识。我会继续扩展。 希望这些年中的某一年,我能振作起来,以实物返回某人。 :)
最佳答案
我会以不同的方式实现整个事情 -
现在,您必须至少解析 3 次从大型机发送的每个字符:创建字符串时一次,解析字符串时一次,为每个新变量创建字符串时一次。对于固定宽度的行,我会选择一个逐个字符地从流中读取的状态机。这并不像听起来那么难,而且它会更好地执行加载,因为它只处理每个字符一次。如果您查看 String.Format() 等函数,这就是 .Net 框架本身处理此类事情的方式。
关于vb.net - 让 string.substring(N) 在 N > string.length 时不窒息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2417841/