棘手的文件解析。不一致的分隔符

时间:2010-03-16 14:36:06

标签: php file parsing

我需要使用以下格式解析文件。

0000000 ...ISBN.. ..Author.. ..Title.. ..Edit.. ..Year.. ..Pub.. ..Comments.. NrtlExt Nrtl Next Navg NQoH UrtlExt Urtl Uext Uavg UQoH ABS NEB MBS FOL 
ABE0001 0-679-73378-7 ABE WOMAN IN THE DUNES (INT'L ED) 1st 64 RANDOM 0.00 13.90 0.00 10.43 0 21.00 10.50 6.44 3.22 2 2.00 0.50 2.00 2.00 ABS 

ID和ISBN不是问题,标题是。这些字段没有设置长度,并且没有可靠的分隔符 - 该空间可用于大部分文件。

另一个问题是评论字段中并不总是有条目。当存在时,内容中存在间隔。

所以我可以得到前两个,最后十四个。我需要一些帮助来弄清楚如何解析中间的六个字段。

此文件是由我无法更改的旧程序生成的。我正在使用php来解析这个文件。

5 个答案:

答案 0 :(得分:1)

我也会问自己'这有多好'和'有多少记录'?

例如,如果你正在解析这个列表以建立一个在网站上出售的书籍目录 - 你可能希望尽可能好,但期望你会错过一些标题并建立反馈机制因此,您的用户可以帮助您解决问题(并使您可以轻松地以新格式修复)。

另一方面,如果你必须把它弄好,因为你会为每个错误的解析分配大量的钱,并且只有几千本书,你应该计划靠近,然后进行人工审查整个文件。

(在我的第一份工作中,我们花了六个星期的数据转换项目来转换150条记录 - 而不是很好地利用时间。)

答案 1 :(得分:1)

按ISBN(在某些在线数据库中)查找该书的标题和出版商,并仅解析其余内容:)

顺便说一句。你确定看起来像空间的东西实际上是一个空间吗?还有更多“不可见”的字符(如非中断空格)。我知道,这不是一个好主意,但显然这种格式的作者非常有创意......

答案 2 :(得分:0)

您需要手动分析数据并找出年份,版本和发布商的外观。例如,如果您发现年份总是两位数而且发布者总是来自某个有限的列表,那么您可以从这开始。

答案 3 :(得分:0)

虽然我没有看到任何其他的方法,但我猜它有点像这样:

我会缩减我所知道的可以解析的内容。离开ABE WOMAN IN THE DUNES (INT'L ED) 1st 64 RANDOM

从那里开始,我会尝试找到版本并在存储和删除版本后将该字符串拆分为两个,然后留下ABE WOMAN IN THE DUNES (INT'L ED)& 64 RANDOM,另一个选择是尝试一年,但当然,诸如1984年的标题可能会出现问题。 (猜测版当然是假设它是所有版本的第7,第51等)。

最后我假设我可以在第二个字符串的开头猜测年64并进一步限制发布者(/ Comment)部分。

其余的只是纯粹的猜测,除非你有一个作者/出版商的名单在某处可以匹配,因为我认为不仅有空格的评论,而且还有名字中有空格的出版商。但至少你应该在一个中包含2个字符串,在另一个中包含发布者(/ Comments)。

总而言之,它应该略微限制手动部分。

一旦完成,我也会在某个地方以更好的格式保存它,所以我不必再去解析它了;)

答案 4 :(得分:0)

我不知道pcre引擎是否允许选择内的多个组,因此:

  

([A-Z0-1] {7})\(\ d- \ d {3} - \ d {5} - \ d)\   (。+)\(\ d(?:st | nd | rd))\ \ d {2} \   ([^ \ d。] +)\(\ d +。\ d {2})\(\ d +。\ d {2})\   (\ d +。\ d {2})\(\ d +。\ d {2})\(\ d {1})\   (\ d +。\ d {2})\(\ d +。\ d {2})\(\ d +。\ d {2})\   (\ d +。\ d {2})\(\ d)\(\ d +。\ d {2})\   (\ d +。\ d {2})\(\ d +。\ d {2})\(\ d +。\ d {2})\   (\ W {3})

它确实看起来很丑陋,并没有解决你的作者标题问题,但它与其余的相匹配。 关于你的问题,我没有看到任何解决方案,但有一个查找表供作者或使用其他服务通过ISBN查找标题和作者。

如果与上面的例子不同,那么作者不仅仅用他们的名字代表。 同时仔细检查上述正则表达式可能发生的所有异常,因为标题可能包含1st或类似。