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

回答:


13

Notepad ++の検索と置換は、これに簡単に使用できる正規表現(regex)をサポートしています。

次の正規表現を使用して検索します。

^[^,]+,(.+)

これは、可能な限り多くの文字が続く行の始まりに一致します。コンマではなく、コンマが続き、残りの行が続きます。行の残りは、最初のサブマッチとしてグループ化されます。

これをグローバルに置き換えます:

\1

これは、最初のサブマッチ(残りの行)を示します。それにより、各行は最初の列とコンマの後のすべてに置き換えられます。

単一のグローバル置換でそれを行う上記の方法を見つけた(そしてそれに応じて返信を更新した)後、この返信は基本的に同一であることに気づきましたが、使用された正規表現の包括的な説明も提供します。


注:^[^,]+, Notepad ++は最後を除くすべての列を置換するため、短い正規表現を空の文字列でグローバル置換に使用することはできません。交換し、次に3番目、というようになります。ただし、短い正規表現は他のエディター(PSPadまたはvimなど)で完全に機能します。


これがここへ行く方法です。OPにすでにN ++が含まれている場合、これが最も簡単な方法です。私はこれをPSPadで何度も行います(一度にこれを行うことができます)。また、正規表現がどのように動作するかチェックアウト:rubular.com/r/OiehkBT0vAを
simbabque

Notepad ++は入力を行ごとに処理するのではなく、文字ごとに処理します。これには、いくつかのきちんとした利点があります(複数行パターンなど)。
デニス

編集のために+1。悲しいことに、あなたの答えは今コミュニティwikiです。
デニス

@Dennisはい、10回の編集の制限に気付いていなかったので、頻繁に編集しました。
スピーカー

なぜ^[^,]+,空ではないのですか?
knittl

10

Ctrl+ Hを押して、次の置換を実行します。

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

次に、Alt+ Aを押してすべての出現箇所を置き換えます。

使い方

  • 正規表現は、 .*?,(.*)行全体にマッチします:

    • .*?, コンマ自体を含む、最初のコンマの前のすべてに一致します。

      .*は任意の文字の出現回数を意味し、疑問符は数量詞をlazyにします。つまり、可能な限り少ない文字に一致します。

    • (.*) 最初のコンマ以降のすべてに一致します。

      .*カッコで囲むとサブパターンに変換されるため、置換フィールドでマストにアクセスできます。

  • \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スタイルの環境を持っていると仮定すると(私のようなゴウ、またはあなたがオフのユーティリティSNARFできるunixutilsを私はを通じてファイルを実行していると信じて)cut -d , -f2-6それが必要、私はトリックを行います正しくリコール場合- -トリックを行う必要があります-d設定しますデリミネーター、およびf2-62番目から6番目の文字を印刷します。

cat input.csv | cut -d , -f2-6 > output.csv入力ファイルを取得して出力ファイルをキックするトリックを実行します。メモ帳は使用しませんが、高速で非常にシンプルです。


おかげで、リンクをクリックしただけで403エラーが発生しましたか?
MikeD

両方のリンクが機能します-これは奇妙です。私は通常、グーグルでグーを見つけます-bmatzelleに属するgithubリポジトリにあります。Cygwinはまた、オプションで、このみかんの事のためにそのやり過ぎかもしれない
ジャーニーマンオタク

2

CSVをExcelにロードし、数値をテキストとして扱うようにする必要があります(科学的な数値への変換を防止します)。

  1. Excelを開く
  2. データタブ
  3. テキストから
  4. 区切り記号を選択
  5. その他を選択: "、"
  6. すべての列について、データプレビューウィンドウでそれらを選択し、テキストを選択します
  7. 列を削除する
  8. CSVとして保存

ExcelでCSVファイルを編集して保存すると、ヨーロッパのExcelのEANコードやUSスタイルのフロートなどの数値が壊れることがよくあります。インポート時にすべてを設定したとしても、たまに何かを食べてしまいます。おそらく機能するでしょうが、お勧めできません。生産的な環境では、それに対するアドバイスをします。
シンバク

これはうまくいきました!Thnakあなた
-MikeD

@simbabqueそれは少し不公平だと思いますが、操作を必要とする大規模なデータセットの実稼働環境でうまく使用しました-確かに悪夢でした。Excelには予期しない方法でデータを変更する習慣がありますが、このリスクが他のアプローチよりも特に大きいとは言いません。
ジェームズウッド

私も時々それを使用しますが、これらの時間のほとんどは私はそれをするのが好きではありません。多くの場合、正規表現の検索と置換をサポートするテキストエディタを使用すると、処理方法がわかっている場合ははるかに高速です。しかし、あなたの答えは明確で簡潔だったので、違反はありません。
シンバク

オイは攻撃を
ジェームズウッド

1

Notepad ++には、組み込みの列編集と(、)コマンドによるラインアップ(TextFXプラグイン)があり、グラフィカルなポイントアンドクリックソリューションを提供します。これにより、正規表現やシェルプログラミングを使用する必要がなくなります。どちらも、通常、必要な処理を行うまでデバッグが必要になります。

開始点:列の位置がずれている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 +同じ列位置をクリックします。これにより、ENTIREファイルの列モードがアクティブになります。すべてのコンマの後ろに縦線が表示されます。

  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プラグインオプションと組み合わせると、さまざまな状況にすばやく適用できます。

たとえば、2番目の列またはN番目の列をすばやく削除することにした場合、このアプローチはほとんど変更なしで機能します。

一方、正規表現、シェルスクリプトは目標を達成しますが、そうですが、複雑な問題では、構文の「デバッグ」により多くの時間を費やすことになります。

Notepad ++の多彩な組み込み機能は、その主な強みの1つです。「プログラミング」に頼ることなく、かなりの力を得ることができます。


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 -1行下に行く
  • 0 -行の先頭に移動します

次に、このアクションをすべての行に適用します。

:0,$ normal q

つまり、キーに割り当てられているアクションをq行の先頭(0)から末尾($)まで実行します。


なぜ単一のグローバル置換を行うだけではありません:%s/^[^,]\+,//gか?
スピーカー

また、これは正規表現ではなく使いやすく、理解しやすいかもしれません:)通常、私は常にどの文字をエスケープしなければならないか混乱しているので、同じ正規表現を何度も入力することになります。
ケノーブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.