当前位置: 首页 > 知识库问答 >
问题:

使用新行修复CSV文件

能逸清
2023-03-14

我使用SQL Server Management Studio在MS SQL数据库上运行了一个查询,一些字段包含新行。我选择将结果保存为csv,显然MS SQL不够智能,无法给我一个格式正确的CSV文件。

其中一些带有新行的字段用引号包装,但有些不是,我不知道为什么(如果它们包含多个新行,似乎会引用字段,但如果它们只包含一个新行,则不会,感谢Microsoft,这很有用)。

当我试图在Excel中打开这个CSV时,由于新行的原因,有些行是错误的,它认为一行是两行。

我怎么才能解决这个问题?

我想我可以使用正则表达式。可能是这样的:

/,[^,]*\n[^,]*,/

问题是它匹配一行的最后一个元素和下一行的第一个元素。

下面是演示该问题的示例 csv:

field a,field b,field c,field d,field e
1,2,3,4,5
test,computer,I like
pie,4,8
123,456,"7

8

9",10,11
a,b,c,d,e

共有2个答案

淳于慎之
2023-03-14

如果您想要java编程解决方案,请使用OpenCSV库打开文件。如果是手动操作,则在Vim等文本编辑器中打开文件并运行替换命令。如果是批量操作,则可以使用perl命令清理CRLF。

季炯
2023-03-14

简单的正则表达式替换不起作用,但这里有一个基于preg_replace_callback的解决方案:

function add_quotes($matches) {
    return preg_replace('~(?<=^|,)(?>[^,"\r\n]+\r?\n[^,]*)(?=,|$)~',
                        '"$0"',
                        $matches[0]);
}

$row_regex = '~^(?:(?:(?:"[^"*]")+|[^,]*)(?:,|$)){5}$~m';

$result=preg_replace_callback($row_regex, 'add_quotes', $source);

$row_regex的秘诀是提前知道有多少列。它从一行的开头开始(多行模式下为 ^),并消耗接下来的五个看起来像字段的东西。它没有我想要的那么高效,因为它总是在最后一列上超调,在回溯到行尾之前消耗“真正的”行分隔符和下一行的第一个字段。如果您的文档非常大,这可能是一个问题。

如果您事先不知道有多少列,您可以通过只匹配第一行并计数匹配项来发现这一点。当然,这假设行不包含导致问题的任何时髦字段。如果第一行包含列标题,您不必担心这一点,也不必担心合法的引用字段。我是这样做的:

preg_match_all('~\G,?[^,\r\n]++~', $source, $cols);

$row_regex = '~^(?:(?:(?:"[^"*]")+|[^,]*)(?:,|$)){' . count($cols[0]) . '}$~m';

您的示例数据只包含换行符(< code>\n),但我也允许DOS样式的< code>\r\n。(由于该文件是由微软产品生成的,所以我不会担心老式Mac风格的CR-only分隔符。)

观看在线演示

 类似资料:
  • 问题内容: 我想写一个可以打印和修改不规则csv文件的程序。格式如下: 例如,数据可以如下所示: 我是一个初学者,但是我没有在网上找到任何可行的资源来解决此类问题。我主要关心的是,我们如何遍历循环并确定俱乐部的日期和名称,并将其输入数组?请指教。 问题答案: 我认为这应该对您有所帮助。基本上,您的CSV杂乱无章。下面是我安排您的csv的代码 这是您将为此获得的输出 我正在从csv.txt中读取文件

  • 我只想从csv文件中返回这些特定列,并将其写入新的csv文件? 我该怎么做 到目前为止,我可以读取数据!!但不知道怎么写 绝对PYTHON BEGGINER警报

  • 我有以下代码: 使用System在我的控制台中输出代码。出来println(line)提供了正确的输出。然而,当我打开CSV文件时,它似乎是反向写入的。Excel首先抱怨行的数量。但是,仅显示原始数据集的最后一行。数据集(预处理效率很低)包含1000多行。因此,我不能简单地附加每个条目。 有更好的方法吗? 提示和技巧是非常受欢迎的。此外,我还尝试了几种编写器:-CSVwrite-BufferedW

  • 问题内容: 目标 我已经从hotmail下载了CSV文件,但其中有很多重复项。这些重复项是完整的副本,我不知道为什么我的手机会创建它们。 我想摆脱重复。 方法 编写python脚本以删除重复项。 技术指标 问题答案: 更新:2016 如果您乐于使用有用的外部库: @IcyFlame解决方案的更有效版本 要就地编辑同一文件,您可以使用此

  • 问题内容: 我有以下代码: 在控制台中,使用System.out.println(line)输出的代码为我提供了正确的输出。但是,当我打开CSV文件时,它似乎是反向写入的。Excel首先抱怨行数。但是,仅显示原始数据集的最后一行。数据集(以一种低效的方式进行了预处理)包含1000多个行。因此,我不能简单地附加每个条目。 有更好的方法吗? 提示和技巧非常受欢迎。更进一步,我尝试了一些编写器:-CSV

  • 我想创造一个新的世界。cmd文件,用于过滤所有。csv文件,然后创建一组。包含结果的csv文件。 下面是一个场景。 有很多。文件夹中的csv文件csv文件中的第一列数据包含一个代码在哪里可以是任何一组数字,范围从 我希望批处理文件在01开始XX,在那里找到HH?????-01,它取行并将结果放入名为的输出文件中 开始时的代码可能不同,因此它还必须过滤 然后对文件夹中的每个csv文件重复此操作。 然