查找和替换双引号之间的换行符 [英] Find & replace line breaks between double quotes

查看:832
本文介绍了查找和替换双引号之间的换行符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个CSV文件,其中包含一些换行符.例如:

"Chiffre","Nom","Descriptif court","Tarifs en clair","Période en clair","Adresse 1","CP","Tel","Site","Facebook","Pictos","@Saveurs","@Famille plus","@Img","Accessible en fauteuil roulant en autonomie","Handicapes","Terrasse","Wifi","Chèque Vacances","Titre Restaurant"
6,"Le Chalet d'en Ô","Cuisine traditionnelle (foie gras, magret myrtilles, croustillant chocolat)
Spécialités savoyardes (fondue, tartiflette.. )
Garanti sans burgers.
Tout est fait maison.Cuisine traditionnelle (foie gras, magret myrtilles, croustillant chocolat)
Spécialités savoyardes (fondue, tartiflette.. )
Garanti sans burgers.
Tout est fait maison.","Menu adulte : de 20 à 30 €
Menu enfant : 10 €.

Suggestion du jour le midi en semaine : entrée,plat, dessert : 20€.Menu adulte : de 20 à 30 €
Menu enfant : 10 €.

Suggestion du jour le midi en semaine : entrée,plat, dessert : 20€.","Midi et soir du jeudi au samedi + midi le dimanche et jours fériés.
Juillet et août, midi et soir du mardi au samedi et midi uniquement dimanche et jours fériés.Midi et soir du jeudi au samedi + midi le dimanche et jours fériés.
Juillet et août, midi et soir du mardi au samedi et midi uniquement dimanche et jours fériés.","Le Cropt - Route de Serraval","74230 Les Clefs","+33 4 50 02 09 00","www.lechaletdeno.com",,"A R J X x",,,,,"A","R","J","X","x"
7,"La Cabane - Pisciculture de Montremont","Bar - restaurant au bord de la rivière dans un cadre champêtre avec sa spécialité la truite.","Menu adulte : de 26 à 35 €.","Juin et septembre : du mercredi au dimanche.
Juillet et août : tous les jours à midi + mercredi à samedi le soir.Juin et septembre : du mercredi au dimanche.
Juillet et août : tous les jours à midi + mercredi à samedi le soir.","Pisciculture de Montremont - 100 impasse des Pesetz","74230 Thônes","+33 4 50 02 00 85","pisciculture-montremont.fr",,"A R  X x",,,,,"A","R",,"X","x"

只需用空格(或其他任何内容)替换任何换行符即可.

尝试了许多现有解决方案,但除其他问题外,使用\\n作为搜索词似乎不起作用.

有什么主意吗?谢谢.

Sublime Text就足够了,但是如果另一个工具更简单,那就没问题了.

编辑:如果仅将其作为搜索词,则\n可以正常工作.但是我只需要在"之间找到它们.到目前为止,我得到的最好的结果是将"之间的所有文本与(?<=")[^"]*匹配.

解决方案

您不能以安全的方式使用文本编辑器来执行此操作,因为开始和结束定界符相同,并且任何基于环视的解决方案或\G基于基础的解决方案将无法正常工作.

使用某种支持回调方法/函数的编程语言作为regex替换方法/函数中的替换参数,用

匹配任何双引号的子字符串

"[^"]*(?:""[^"]*)*"

请参见 regex演示.如果您不需要关心字面双引号,则其简化版本是"[^"]+".

详细信息

  • "-双引号
  • [^"]*-除双引号外的0+个字符
  • (?:-重复0次以上的分组构造
    • ""-2个双引号
    • [^"]*-除双引号外的0+个字符
  • )*-
  • "-双引号.

此正则表达式可以按以下方式使用:读取文件并使用以下解决方案:

  • 的问题:re.sub(r'"[^"]*(?:""[^"]*)*"', lambda m: m.group(0).replace("\n", ""), s)
  • 的问题:s = s.replace(/"[^"]*(?:""[^"]*)*"/g, function(m) { return m.replace(/\n/g, ''); })
  • 的问题:$s = preg_replace_callback('~"[^"]*(?:""[^"]*)*"~', function($m) { return str_replace("\n", "", $m[0]); }, $s)
  • 的问题:s = Regex.Replace(s, "\"[^\"]*(?:\"\"[^\"]*)*\"", m => m.Value.Replace("\n", ""))

如果要删除\r\n作为第二步,则可以在JS中使用.replace(/[\r\n]+/g, ''),在PHP中使用preg_replace('~\R+~', '', $m[0]),在C#中使用m.Value.Replace("\r", "").Replace("\n",""),在Python中使用m.group(0).replace("\n", "").replace("\n", "").

在C#中,完整的解决方案看起来像

using System.IO;
...
var file = "path_to_file";
var path_to_save = "path_to_save";
var contents = string.Empty;
using (var sr = new StreamReader(file, true)) // true for a Unicode encoding
{
    contents = sr.ReadToEnd();
}
contents = Regex.Replace(contents, "\"[^\"]*(?:\"\"[^\"]*)*\"", 
    m => m.Value.Replace("\n", "").Replace("\r", ""));
using (var sw = new StreamWriter(path_to_save, false, Encoding.UTF8))
{
    sw.Write(contents);
    sw.Close();
}

I have a CSV file containing some line breaks in values. For example:

"Chiffre","Nom","Descriptif court","Tarifs en clair","Période en clair","Adresse 1","CP","Tel","Site","Facebook","Pictos","@Saveurs","@Famille plus","@Img","Accessible en fauteuil roulant en autonomie","Handicapes","Terrasse","Wifi","Chèque Vacances","Titre Restaurant"
6,"Le Chalet d'en Ô","Cuisine traditionnelle (foie gras, magret myrtilles, croustillant chocolat)
Spécialités savoyardes (fondue, tartiflette.. )
Garanti sans burgers.
Tout est fait maison.Cuisine traditionnelle (foie gras, magret myrtilles, croustillant chocolat)
Spécialités savoyardes (fondue, tartiflette.. )
Garanti sans burgers.
Tout est fait maison.","Menu adulte : de 20 à 30 €
Menu enfant : 10 €.

Suggestion du jour le midi en semaine : entrée,plat, dessert : 20€.Menu adulte : de 20 à 30 €
Menu enfant : 10 €.

Suggestion du jour le midi en semaine : entrée,plat, dessert : 20€.","Midi et soir du jeudi au samedi + midi le dimanche et jours fériés.
Juillet et août, midi et soir du mardi au samedi et midi uniquement dimanche et jours fériés.Midi et soir du jeudi au samedi + midi le dimanche et jours fériés.
Juillet et août, midi et soir du mardi au samedi et midi uniquement dimanche et jours fériés.","Le Cropt - Route de Serraval","74230 Les Clefs","+33 4 50 02 09 00","www.lechaletdeno.com",,"A R J X x",,,,,"A","R","J","X","x"
7,"La Cabane - Pisciculture de Montremont","Bar - restaurant au bord de la rivière dans un cadre champêtre avec sa spécialité la truite.","Menu adulte : de 26 à 35 €.","Juin et septembre : du mercredi au dimanche.
Juillet et août : tous les jours à midi + mercredi à samedi le soir.Juin et septembre : du mercredi au dimanche.
Juillet et août : tous les jours à midi + mercredi à samedi le soir.","Pisciculture de Montremont - 100 impasse des Pesetz","74230 Thônes","+33 4 50 02 00 85","pisciculture-montremont.fr",,"A R  X x",,,,,"A","R",,"X","x"

Just need to replace any line break with a space (or anything).

Tried a lot of existing solutions, but using \\n as search term doesn't seem to work, among other issues.

Any idea? Thanks.

Sublime Text would suffice but if another tool is easier, no problem.

Edit: \n works fine if I have only this as the search term. But I need to find them only between ". The best I got so far is matching all text between " with: (?<=")[^"]*.

解决方案

You cannot do that with a text editor in a safe way because the starting and ending delimiters are identical, and any lookaround-based solution, or a \G based solution won't work well.

Use some programming language that supports a callback method/function as the replacement argument in a regex replace method/function, match any double quoted substring with

"[^"]*(?:""[^"]*)*"

See the regex demo. A simplified version if you do not need to care about literal double quotes is "[^"]+".

Details

  • " - a double quote
  • [^"]* - 0+ chars other than double quotes
  • (?: - a grouping construct that is repeated 0+ times
    • "" - 2 double quotes
    • [^"]* - 0+ chars other than double quotes
  • )* -
  • " - a double quote.

This regex can be used as follows: read in a file and use the following solutions:

  • : re.sub(r'"[^"]*(?:""[^"]*)*"', lambda m: m.group(0).replace("\n", ""), s)
  • : s = s.replace(/"[^"]*(?:""[^"]*)*"/g, function(m) { return m.replace(/\n/g, ''); })
  • : $s = preg_replace_callback('~"[^"]*(?:""[^"]*)*"~', function($m) { return str_replace("\n", "", $m[0]); }, $s)
  • : s = Regex.Replace(s, "\"[^\"]*(?:\"\"[^\"]*)*\"", m => m.Value.Replace("\n", ""))

If you have \r and \n to remove, as a second step, you may use .replace(/[\r\n]+/g, '') in JS, preg_replace('~\R+~', '', $m[0]) in PHP, m.Value.Replace("\r", "").Replace("\n","") in C# and m.group(0).replace("\n", "").replace("\n", "") in Python.

In C#, the full solution will look like

using System.IO;
...
var file = "path_to_file";
var path_to_save = "path_to_save";
var contents = string.Empty;
using (var sr = new StreamReader(file, true)) // true for a Unicode encoding
{
    contents = sr.ReadToEnd();
}
contents = Regex.Replace(contents, "\"[^\"]*(?:\"\"[^\"]*)*\"", 
    m => m.Value.Replace("\n", "").Replace("\r", ""));
using (var sw = new StreamWriter(path_to_save, false, Encoding.UTF8))
{
    sw.Write(contents);
    sw.Close();
}

这篇关于查找和替换双引号之间的换行符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆