Notepad++ - 尝试重新格式化一些内容

4

我有一个CSV,基本上每行看起来像:

06444|WidgetAdapter 6444|Description:

Here is a description.
Maybe some more.
|0

第三个字段中的文本总是不同和多变的,我试图仅替换其中所有的换行符为<br>,这样最终结果会变成

06444|WidgetAdapter 6444|Description: <br>Here is a description.<br>Maybe some more.<br>|0

编辑:

我需要消除所有换行符,使每一行成为一个合适的VALUE|VALUE|VALUE|VALUE。规范化/美化/清理它。

我的工具无法正确导入此内容,phpMyAdmin会出错等。 字段内有换行符,没有转义的双引号等。

其他字段示例:

08681|Book 08681|"Testimonial" - Person

You should buy this.|

另一个字段的示例:

39338|Itemizer||

删除我的答案,它看起来比简单的查找/替换要复杂得多... - BoltClock
看起来您需要澄清您的问题,请明确具体一些 :) - user456814
我同意BoltClock的观点。 - Alec Gorge
2个回答

1
如果需要的话,可以使用正则表达式来定位这些换行符。思路是找到仅在后面跟着一个额外值的换行符,然后只匹配整行。我们可以检查当前换行符后面的值的数量是否为1模4,这样我们就知道我们在第3列:
(?:\r\n?|\n)(?=[^|]*\|[^\n\r|]*\s*(?:^(?:[^|]*\|){3}[^\n\r|]*$\s*)*\Z)

或者,附上(某些)解释:

(?:\r\n?|\n)   # Match a newline
(?=            # that is before...
    [^|]*\|[^\n\r|]*\s*               # one more separator and value
    (?:^(?:[^|]*\|){3}[^\n\r|]*$\s*)* # and some lines with 4 values.
    \Z                                # until the end of the string.
)

我无法在Notepad++上使其工作(它甚至不匹配[\r\n]),但它似乎在其他引擎上运行良好:


重要通知:这种方法对于30万行可能有点慢。 - Kobi

1
如果您知道您有4列数据,那么您可以轻松地解析它们。例如,以下是一行PHP代码,它将生成一个包含所有数据的数组。数组中的每一行都是另一个数组,其中包含所有捕获组:[0] 包含整个匹配,[1]-[4] 分别包含每一列的数据。
$pattern = '/^([^|]*)\|([^|]*)\|([^|]*)\|([^|]*)$/m';
preg_match_all($pattern, $data, $matches, PREG_SET_ORDER);

这个模式非常简单:它由4个值(不是管道符号)组成,用3个管道符号分隔。一旦你有了数据,你可以轻松地按照自己的方式重建它,例如使用{{link1:nl2br}}。
请注意,如果第一列和最后一列也可能包含换行符,则无法可靠地解析数据。

工作示例:http://ideone.com/gG0K3


我并不总是知道我是否有4列。 - jmoon
最后一列混合了\r或\n用于换行,有时是文本形式,有时是实际字符。并非每行都具有相同数量的列。很不幸,我正在尝试解决这个问题。 - jmoon
@Jmoon - 嗯...但只有第三个可能有新行吗?如果是这样,/ ^ [^ | \ r \ n] * \| [^ | \ r \ n] * \| [^ |] * \| ([^ \ r \ n] *) $ / m 可能适合您,您需要在 | 上拆分。我不确定它有多可解决...我很乐意听到更多细节 :) - Kobi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接