Notepad ++-删除逗号分隔文件中的第一列


14

我有一个很大的CSV文件,需要删除数据的第一列。我无法在Excel中打开它,因为Excel会将列中的某些值转换为科学数字。

我正在使用Notepad ++,并且试图将文件EXE的第一列作为字符串,

1,Value1,value2,value3,value4,value5
3445,Value1,value2,value3,value4,value5
12345,Value1,value2,value3,value4,value5
1234,Value1,value2,value3,value4,value5
11,Value1,value2,value3,value4,value5

看起来像

Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5
Value1,value2,value3,value4,value5

Answers:


13

Notepad ++的搜索和替换支持正则表达式(regex),可以很方便地使用它。

使用以下正则表达式搜索:

^[^,]+,(.+)

这与行的开头相匹配,后跟尽可能多的字符,而不是逗号,后跟逗号,然后是行的其余部分。该行的其余部分分组为第一个子匹配项。

全局替换为:

\1

这表示第一个子匹配项(该行的其余部分)。这样,第一行和逗号后的所有行将替换为每一行。

在我发现上述方法可以在单个全局替换中完成操作(并相应地更新了我的答复)之后,我注意到该答复基本上是相同的,但也对所使用的正则表达式进行了全面的解释。


注意:较短的正则表达式^[^,]+,不能用于用空字符串进行全局替换,因为Notepad ++随后将替换除最后一列之外的所有列:替换第一列之后,第二列(现在是第一列,与正则表达式完全匹配)将被替换,然后是第三个,依此类推。但是,较短的正则表达式可与其他编辑器完美配合(例如,使用PSPadvim)。


这是去这里的方式。如果OP已经具有N ++,则这是最快的方法。我用PSPad做了很多(可以一口气做到这一点,顺便说一句)。另外,请查看正则表达式的工作原理:rubular.com/r/OiehkBT0vA
simbabque 2012年

Notepad ++不会逐行处理输入,而是逐字符处理。这具有一些巧妙的优点(例如多行模式)。
丹尼斯

+1以进行编辑。不幸的是,您的答案现在是社区Wiki。
丹尼斯2012年

@Dennis是的,我编辑得太频繁了,因为我不知道10次编辑的限制。
讲者2012年

为什么不^[^,]+,替换为空?
knittl

10

Ctrl+ H并执行以下替换:

Find what:          .*?,(.*)
Replace with:       \1
Wrap around:        checked
Regular expression: selected
. matches newline:  unchecked

现在按Alt+ A替换所有出现的情况。

怎么运行的

  • 正则表达式 .*?,(.*)匹配的整行:

    • .*?, 匹配第一个逗号之前的所有内容,包括逗号本身。

      .*表示出现任何字符的次数不计其数,问号使量词变得懒惰,即,它匹配的字符越少越好。

    • (.*) 匹配第一个逗号之后的所有内容。

      包围.*在括号其转换成一个子模式,因此在桅杆可在替换字段来访问。

  • \1代表第一个子匹配项(对的匹配项(.*))。

    如此一来,Notepad ++会用第一个逗号后的所有内容替换该行。


在注意到用空字符串全局替换在Notepad ++中不起作用后才有了相同的想法^[^,]+,。(+1)
发言人

6

在Windows中,您可以按照以下步骤进行操作。

for /F "tokens=2,3,4,5,6 delims=," %i in (Input.csv) do @echo %i,%j,%k,%l,%m  >> output.csv

我假设您只有6列。如果您还有更多列,请尝试在令牌字段中尝试*。想法是从Windows获取命令的


2
对于任意数量的列,请使用:for /F "tokens=1* delims=," %i in (Input.csv) do @echo %j >> output.csv
SeanC

3

假设您有一个linux系统或某些unix风格的环境(我喜欢gow,或者您可以从unixutils中分离实用程序),我相信通过文件运行cut -d , -f2-6应该可以解决问题-如果我没记错的话,应该可以解决问题- -d设置分隔符,并f2-6打印出第二到第六个字符。

cat input.csv | cut -d , -f2-6 > output.csv将采取把输入文件,并踢出输出文件的技巧。它不使用记事本,但快速而简单。


谢谢,我只是单击了链接,却收到403错误?
MikeD 2012年

两个链接都对我有用-这很奇怪。我通常通过谷歌搜索找到gow-它在属于bmatzelle的github存储库上。Cygwin也可能是一个选择,但是对于这种事情,它是一个过大的杀手
Journeyman Geek

2

您应该能够将CSV加载到excel中,并使其将数字视为文本(防止将其转换为科学数字)。

  1. 开启Excel
  2. 数据标签
  3. 从文字
  4. 选择定界
  5. 选择其他:“,”
  6. 对于所有列,在“数据预览”窗口中选择它们,然后选择“文本”
  7. 删除专栏
  8. 另存为CSV

在Excel中编辑和保存CSV文件通常会打断EAN代码和欧洲Excel中的美式浮点数字。即使您在导入时设置了所有内容,它也会吃掉一些东西。我不能推荐它,尽管它可能会起作用。在生产环境中,我会建议您这样做。
simbabque 2012年

这很棒!感激您
MikeD 2012年

@simbabque我会说这有点不公平,我已经在生产环境中成功地将其用于需要操纵的大型数据集-有时这是一场噩梦。Excel确实有以意想不到的方式更改数据的习惯,但是我不会说这种风险尤其比其他方法更大。
詹姆斯·伍德

我也偶尔使用它,但是大多数时候我不喜欢这样做。使用支持正则表达式搜索和替换的文本编辑器通常会快很多,如果知道如何处理它的话。但是,因为您的回答清晰明了,所以没有冒犯。
2012年

oi没有进攻:D
James Wood

1

Notepad ++具有内置的列编辑和Line Up by(,)命令(TextFX插件),提供了图形化的单击解决方案,这可能是第一次使用。这避免了必须使用正则表达式或shell编程,这两种方法通常都需要进行调试,直到它们完全执行所需的操作,仅此而已。

起点:CSV文件的列未对齐,因此不容易按列进行编辑...

    1,Value1,value2,value3,value4,value5
    3445,Value1,value2,value3,value4,value5
    12345,Value1,value2,value3,value4,value5
    1234,Value1,value2,value3,value4,value5
    11,Value1,value2,value3,value4,value5
    ...

程序:

  1. 选择感兴趣的行-可能是整个文件。

  2. 使用菜单命令TextFX> TextFX Edit>按逗号排列多行(,),这将按列排列所有行,并使列编辑变得容易。

    1    ,Value1,value2,value3,value4,value5
    3445 ,Value1,value2,value3,value4,value5
    12345,Value1,value2,value3,value4,value5
    1234 ,Value1,value2,value3,value4,value5
    11   ,Value1,value2,value3,value4,value5
    
  3. 在第一个逗号(,)后面的列中进入列模式。对于少量行,请使用键盘命令:Alt + Shift + DownArrow。
    如果需要处理许多行(大文件),请使用Alt +鼠标并单击第一行的所需列,然后移至文件的最后一行,然后Alt + Shift +单击相同的列位置。这将激活整个文件上的列模式-您应该在所有逗号后面看到一条垂直线。

  4. 删除在列模式消除字符的整列。因此,您可以一次删除所有行中第一个逗号之前的所有内容,以获取:

    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    Value1,value2,value3,value4,value5
    

做完了!

与到目前为止建议的其他各种解决方案相比,此解决方案的备注:

列模式编辑功能非常强大,并且与TextFX插件选项结合使用时,可以点对点的方式应用于各种情况。

例如,如果您决定快速删除第二列或第N列,则此方法几乎不需要修改即可工作。

另一方面,正则表达式,shell脚本可以实现目标,是的,但是在复杂的问题中,您将花费更多的时间“调试”语法。

Notepad ++的通用内置功能是其主要优点之一:您无需借助“编程”即可获得相当多的功能。


0

如果您熟悉Notepad ++ 的Python控制台插件,我可以为您推荐另一种方法。您需要在Notepad ++文档上添加文本,并在控制台中执行下一个脚本:

res = []
data = editor.getText().split('\r\n')
for i in data:
    res.append(i.split(',')[1:])

for i in res:
    editor.addText(', '.join(i)+'\r\n')

该脚本将结果文本添加到当前的Notepad ++文档中。


-1

运行vim(在命令模式下,如果未按Escape键)。

键入以下命令以将删除第一列的操作映射到q键:

:map q 0df,j0

意思是:

  • 0 -转到行首
  • df,- d elete一切,直到字符(包括逗号)
  • j -下一行
  • 0 -转到行首

然后将此操作应用于所有行:

:0,$ normal q

也就是说,q从开头(0)到结尾($)行运行分配给键的操作。


为什么不只用一个全局替换:%s/^[^,]\+,//g
讲者2012年

您也可以使用它,它比regex更易于使用和理解:)通常,我总是很困惑自己必须转义哪个字符,因此我以多次键入相同的regex结尾。
kenorb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.