Notepad ++ - Eliminando la primera columna en un archivo separado por comas

14

Tengo un archivo CSV grande que necesito para eliminar la primera columna de datos. No puedo abrirlo en Excel porque Excel convierte algunos de los valores en las columnas a números científicos.

Estoy usando Notepad ++ , y estoy tratando de encadenar la primera columna del archivo 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

parecer

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
MikeD
fuente

Respuestas:

13

La búsqueda y reemplazo de Notepad ++ admite expresiones regulares (regex) que pueden usarse fácilmente para esto.

Use la siguiente expresión regular para buscar:

^[^,]+,(.+)

Esto coincide con el inicio de la línea seguido de tantos caracteres como sea posible, no siendo una coma seguida de una coma seguida por el resto de la línea. El resto de la línea se agrupa como primera subcoincidencia.

Reemplazar globalmente con esto:

\1

Esto denota la primera subcoincidencia (resto de la línea). Por eso, cada línea se reemplaza por todo después de la primera columna y coma.

Después de encontrar la forma anterior de hacerlo en un solo reemplazo global (y actualicé mi respuesta en consecuencia), noté que esta respuesta es básicamente idéntica pero también brinda una explicación exhaustiva de la expresión regular utilizada.


Nota: La expresión regular más corta ^[^,]+,no se puede usar para el reemplazo global con una cadena vacía, ya que Notepad ++ reemplazará todas las columnas excepto la última: después de reemplazar la primera columna, la segunda columna (que ahora es la primera y coincide exactamente con la expresión regular) ser reemplazado, luego el tercero, y así sucesivamente. Sin embargo, la expresión regular más corta funciona perfectamente con otros editores (por ejemplo, con PSPad o vim ).

hablador
fuente
Este es el camino a seguir aquí. Si el OP ya tiene N ++, esta es la forma más rápida. Hago esto mucho con PSPad (que podría hacer esto de una vez, por cierto). También vea cómo funciona la expresión regular: rubular.com/r/OiehkBT0vA
simbabque
Notepad ++ no procesa la entrada línea por línea, sino carácter por carácter. Eso tiene algunas ventajas (como los patrones de varias líneas).
Dennis
+1 para la edición. Lamentablemente, su respuesta es wiki comunitaria ahora.
Dennis
@ Dennis Sí, edité con demasiada frecuencia ya que no conocía el límite de 10 ediciones.
hablante
¿Por qué no ^[^,]+,y reemplazar con vacío?
knittl
10

Presione Ctrl+ Hy realice el siguiente reemplazo:

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

Ahora presione Alt+ Apara reemplazar todas las ocurrencias.

Cómo funciona

  • La expresión regular .*?,(.*) coincide con una línea completa:

    • .*?, coincide con todo antes de la primera coma, incluida la coma misma.

      .*significa cualquier número de ocurrencias de cualquier carácter, y el signo de interrogación hace que el cuantificador sea vago , es decir, coincide con la menor cantidad de caracteres posible.

    • (.*) coincide con todo después de la primera coma.

      El encerrarlo .*entre paréntesis lo convierte en un subpatrón, por lo que se puede acceder al mástil en el campo de reemplazo.

  • \1representa la primera subcoincidencia (coincidencia para (.*)).

    Como resultado, Notepad ++ reemplaza la línea por todo lo que sigue a la primera coma.

Dennis
fuente
Acabo de tener la misma idea después de notar que ^[^,]+,globalmente reemplazado por una cadena vacía no funcionará en Notepad ++. (+1)
hablante el
6

En Windows, puede hacerlo de la siguiente manera.

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

Supuse que solo tienes 6 columnas. Si tiene muchas más columnas, intente experimentar con * en el campo de tokens. La idea se toma de Windows para el comando

Sriniv
fuente
2
para un número arbitrario de columnas, use esto:for /F "tokens=1* delims=," %i in (Input.csv) do @echo %j >> output.csv
SeanC
3

Suponiendo que tiene un sistema Linux o algún entorno de estilo Unix (me gusta Gow , o puede desglosar las utilidades de Unixutils ), creo que ejecutar el archivo cut -d , -f2-6debería ser el truco, debería, si recuerdo correctamente, hará el truco: -destablece el deliminador, e f2-6imprime el segundo al sexto carácter.

cat input.csv | cut -d , -f2-6 > output.csvharía el truco tomando el archivo de entrada y expulsando un archivo de salida. No está usando el bloc de notas, pero es rápido y realmente simple.

Journeyman Geek
fuente
Gracias, acabo de hacer clic en el enlace y recibí un error 403.
MikeD
ambos enlaces funcionan para mí, lo cual es extraño. Por lo general, encuentro gow buscando en Google, está en un repositorio Github que pertenece a Bmatzelle. Cygwin también podría ser una opción, pero es una exageración para este tipo de cosas
Journeyman Geek
2

Debería poder cargar el CSV en Excel y hacer que trate los números como texto (evitando que se convierta en números científicos).

  1. Abrir Excel
  2. Pestaña de datos
  3. Del texto
  4. Elija delimitado
  5. Elija Otro: ","
  6. Para todas las columnas, selecciónelas en la ventana Vista previa de datos y elija Texto
  7. Elimina tu columna
  8. Guardar como CSV
James Wood
fuente
Editar y guardar archivos CSV en Excel a menudo rompe números como códigos EAN y flotantes de estilo estadounidense en Excel europeo. Incluso si configura todo al importar, sucede que se come algunas cosas. No puedo recomendarlo, aunque probablemente funcionaría. En un entorno productivo, aconsejaré en contra.
simbabque
Esto funcionó muy bien! Gracias
MikeD
@simbabque Diría que es un poco injusto, lo he usado con éxito en entornos de producción para grandes conjuntos de datos que requieren manipulación, es cierto que a veces fue una pesadilla. Excel tiene la costumbre de alterar los datos de maneras inesperadas, pero no diría que este riesgo fue especialmente mayor que otros enfoques.
James Wood el
Lo uso en ocasiones también, pero la mayoría de las veces no me gusta hacerlo. A menudo es mucho más rápido usar un editor de texto que admita la búsqueda y reemplazo de expresiones regulares si uno sabe cómo manejarlo. Sin embargo, no te ofendas, ya que tu respuesta fue clara y concisa.
simbabque
No me estaba ofendiendo: D
James Wood
1

Notepad ++ tiene una edición de columna incorporada y un comando Line Up by (,) (complemento TextFX) que ofrece una solución gráfica de apuntar y hacer clic que probablemente sea la primera vez que está bien. Esto evita tener que usar expresiones regulares o programación de shell, que normalmente requieren alguna depuración hasta que hacen exactamente lo que quieres y nada más.

Punto de partida : archivo CSV con columnas desalineadas, por lo que no es fácil editar por columna ...

    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
    ...

Procedimiento:

  1. Seleccione las filas de interés, tal vez todo el archivo.

  2. Use el comando de menú TextFX> TextFX Editar> Alinear varias líneas por coma (,) Esto alinea todas las filas por columna y facilita la edición de columnas.

    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. Ingrese al modo de columna en la columna después de la primera coma (,) Para una pequeña cantidad de filas, use los comandos del teclado: Alt + Mayús + Flecha abajo.
    Si necesita trabajar en muchas filas (archivo grande), use Alt + mouse y haga clic en la columna deseada de la primera línea, luego muévase a la última línea del archivo y Alt + Shift + haga clic en la misma posición de columna. Esto activa el modo de columna en el archivo ENTERO; debería ver una línea vertical detrás de todas las comas.

  4. Eliminar en modo columna elimina una columna completa de caracteres. Por lo tanto, puede eliminar todo antes de la primera coma en todas las filas de una vez para obtener:

    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
    

¡Hecho!

Observa esta solución en comparación con las otras sugeridas hasta ahora:

La edición en modo de columna es bastante poderosa y, cuando se combina con las opciones del complemento TextFX, se aplica a una variedad de situaciones de manera rápida y precisa.

Por ejemplo, si decidió eliminar la segunda columna, o la enésima columna rápidamente, este enfoque funciona casi sin modificaciones.

Las expresiones regulares, los scripts de shell, por otro lado, lograrán el objetivo, sí, pero en problemas complicados pasará más tiempo "depurando" su sintaxis.

La versátil funcionalidad incorporada de Notepad ++ es una de sus principales fortalezas: obtienes bastante potencia sin tener que recurrir a la "programación".

Assad Ebrahim
fuente
0

Si está familiarizado con el complemento de consola de Python para Notepad ++, puedo aconsejarle otro método. Debe agregar su texto en el documento Notepad ++ y ejecutar el siguiente script en la consola:

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')

Este script agregó el texto del resultado a su documento actual de Notepad ++.

Ishikawa Yoshi
fuente
-1

Ejecutar vim(en el modo de comando, si no, presione Escape).

Escriba el siguiente comando para asignar la acción de eliminar la primera columna a la qclave:

:map q 0df,j0

Lo que significa:

  • 0 - ir al comienzo de la línea
  • df,- d elegir todo hasta , personaje (incluyendo coma),
  • j - baja una línea
  • 0 - ir al comienzo de la línea

Luego aplique esta acción a todas las líneas:

:0,$ normal q

Lo que significa, ejecuta la acción que se asigna a la tecla qdesde la línea desde el principio (0) hasta el final ($).

kenorb
fuente
¿Por qué no solo hacer un reemplazo global con :%s/^[^,]\+,//g?
hablante
También podría hacerlo, este es fácil de usar y de entender en lugar de expresiones regulares :) Por lo general, siempre estoy confundido de qué personaje tengo que escapar, así que termino escribiendo la misma expresión regular muchas veces.
kenorb