我正在try 弄清楚正则表达式,并使用PHP修复CSV文件.CSV文件的格式应如下所示:

id, text field1, text field2
1,some text,another text
2,some text,another text
3,some text,another text

问题是,有时"Text field1"中有一个新的行字符,CSV文件的内容如下:

id, text field1, text field2
1,some text,another text
2,some 
text,another text
3,some text,another text

因此,当逐行读取文件或使用新行分解以逐行填充数组时,我会得到无效记录.我使用以下代码修复了上面的问题:

<?php
$c= file_get_contents($myFile);
$c= preg_replace( '/\n([^0-9])/is', "\n~~$1", $c );
$c= str_replace( "\n~~", " ", $c );
?>

上面的正则表达式判断换行符后面的字符是否不是数字,然后在那里添加一个~~号,我用空格替换换行符和~~号.

问题是,有时"文本字段1"中有数字,换行符就出现在它们的前面,如下所示:

id, text field1, text field2
1,some text,another text
2,some 
1999-06-21 text,another text
3,some text,another text

在这种情况下,我的正则表达式没有放置~~号,并且我得到了一个损坏的CSV文件.

我如何修改上面的正则表达式来解决这个问题?我希望有一个正则表达式,它可以判断"后跟逗号的非数值(任何长度)".请注意,我在csv文件中有超过100000条记录,所以如果使用正则表达式方法,那么正则表达式必须判断任何长度的非数字值.

大概是这样的:

$c= preg_replace( '/\n([^0-9]*\,)/is', "\n~~$1", $c);

但上面的正则表达式不起作用,我不知道有多少正则表达式才能使其起作用.

如果有任何其他方法来修复这个CSV文件,即使这样也是可以的.它不一定是正则表达式解决方案.

谢谢

推荐答案

我不会逐行阅读,因为字符串可以具有完全正确的 里面有一些新的台词.而是what's missing in this CSV file is some double quotes around the strings.如果text field1text field2会发生什么 里面有逗号吗?它会让你的CSV崩溃得更厉害.

由于您无法将CSV源正确更正为输出,因此我们可以将 基于逗号的内容(如果我们认为您在文本中没有一些内容). 正如您知道我们只有3个字段,我们知道它应该是理想的匹配 就像这样:

(\d+),([^,]*),([^,]*?)(?:\r?\n|$)

你可以在这里测试一下:https://regex101.com/r/YLnNOY/2

在PHP中:

<?php

$regex = '/(\d+),([^,]*),([^,]*?)(?:\r?\n|$)/';

$wrong_csv = 'id, text field1, text field2
1,some text,another text
2,some text,another text
3,some text,another text
1,some text,another text
2,some 
text,another text
3,some text,another text
1,some text,another text
2,some 
1999-06-21 text,another text
3,some text,another text';

$replacement = '$1, "$2", "$3"' . "\n";

$corrected_csv = preg_replace(
    $regex,
    $replacement,
    $wrong_csv
);

print $corrected_csv;

您可以在此处运行PHP演示:https://onlinephp.io/c/8aa48

Php相关问答推荐

PHP FFI—Convert void * to int

通过激活模板在数据库中创建表

PHP cUrl扩展与v8.2.12更新损坏

与会者在WooCommerce中按购物车项目数量自定义 checkout 字段

在特定订单状态更改时自定义WooCommerce订单发货项目

在内部API请求之后,在响应客户端之前,是否忘记了PHP中的Header()?

在PHP中读取JSON

有没有可能从composer 过时的输出中隐藏不需要的主要版本?

返回WooCommerce中的所有已启用变体

使用ESI的Symfony Sulu清漆

SFTP在PHP(phpseclib3\Net\SFTP)-过滤目录列表结果服务器端可能吗?类似于psftp中的LS命令?

可以';exec、system和shell_exec PHP函数中的命令字符串上的字符数不得超过8175

Woocommerce 临时购物车税未根据第一个请求正确计算

使用 foreach php 将记录正确分配给正确的父级

无法在 Laravel 中实例化抽象类 ProductAbstract

将 WooCommerce 0 销售价格替换为自定义文本,并保留常规价格删除线

.htaccess环境变量条件不被判断

Laravel Docker 几个数据库

遇到特定键时修改二维数组以创建嵌套数据集

如何将在同一台服务器上运行的 2 个 PHP 应用程序与使用公共会话分开