viking
Goto Top

Mit batch aus CSV Datei bestimmte Spalten ausschneiden und in neue TXT Datei einfügen

Hallo, hab wieder mal eine Frage an die Experten, ...

Ich habe eine CSV Datei (c:/temp/test.csv)
Diese Datei hat viele Spalten (252 Spalten)und ich benötige nur bestimmte davon.
Die Datei hat viele Zeilen.

Nun benötige ich eine neue Datei (c:/temp/Ergebnis.txt (Tabulator als Trennzeichen)
Aus der Ursprungsdatei sollen aber nur folgende Spalten übergeben werden.
Spalte 1, Spalte 121 bis Spalte 144, Spalte 209 bis Spalte 232.
Alle anderen Spalten benötige ich nicht.

Wie kann ich das lösen?

Alternativ würde mich noch interessieren, wie ich es lösen kann, wenn ich folgendes erreichen will:
Das auslesen von Spalte 1 sowie Spalte 16 und Spalte 17.
Also nur dies drei Spalten in eine Textdatei, der Rest interessiert nicht.


Danke viking

Content-ID: 191890

Url: https://administrator.de/contentid/191890

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

pieh-ejdsch
pieh-ejdsch 26.09.2012 aktualisiert um 19:50:10 Uhr
Goto Top
moin viking,

gabs doch schon
Eine Tabelle aus einer großen CSV exportieren

Gruß Phil
viking
viking 26.09.2012 um 23:35:23 Uhr
Goto Top
Hallo Phil,
hab mir das angesehen, ..., ist zwar ähnlich, aber soweit ich das verstanden habe war in dem Beispiel von nur einer Spalte die Rede.

Ich benötige im Gegensatz zum verlinkten Beispiel mehrere Spalten, die nicht nebeneinander stehen.
Also ums einfach zu halten Spalte 1, 16 und 17.

... mit dem verlinkten Beispiel komme ich nicht weiter.

Gruß Viking
pieh-ejdsch
pieh-ejdsch 27.09.2012 aktualisiert um 12:33:16 Uhr
Goto Top
hallo Viking,

genau diesen Batch meinte ich. Ähnlich? Der Tut genau was Du möchtest.
Ich schreibe doch gar nicht so undeutlich!
Pass die Variablen InFile OutFile sowie Cells an.

Hier ist nochmal eine Version direkt zur Verwendung im CMD Fenster.
Eine Hilfe und Fehlerbehandlung ist enthalten:
CSV-extrakt.cmd
@echo off
setlocal disabledelayedexpansion

 :: echo on

if "%~1" equ "/?" echo Extrahiert die angegebenen Spalten aus einer mit Semikolon unterteilten Datei.^  
 & echo(^
 & <nul set /p "=%~n0 " &echo Quelle [Ziel] /T:[x ^| TAB] /C:n [n ...]&echo(^  
 & echo    /T:x      Angabe eines anderen TrennZeichens x,^
 & echo    /T:        Bei Leerzeichn wird nichts angegeben.^
 & echo    /T:TAB    Angabe um Tabulator als Trennzeichen zu nehmen.^
 & echo    /C:n      Angabe der Zelle^(n^)/Spalte^(n^) &exit /b 0

for %%i in (Cin Cells InFile OutFile ) do set "%%i="  
set "T=;"  
for %%i in (%* ) do (
  set "No="  
  for /f "tokens=1*delims=:" %%i in ("%%~i" ) do (  
    if defined Cin set "No=1" &call set "Cells=%%cells%%%%~i %%~j "  
    if /i "%%~i" equ "/C" set "No=1" &set "Cin=1" &set "Cells=%%~j "  
    if /i "%%~i" equ "/T" set "No=1" &if /i "%%~j" equ "TAB" (set "T=	") else set "T=%%~j"  
  )
  if not defined No (
    if defined InFile if not defined OutFile set "Outfile=%%~i"  
    if not defined InFile set "Infile=%%~i"  
) )
find "" "%Infile%" |find "---------- " >nul ||echo FEHLER: "%InFile%" >&2 &&exit /b 1  
if not defined Cells echo FEHLER: Keine Zelle!& exit /b 2
echo  %Cells% |findstr /rc:" 00*" >nul &&echo FEHLER: Zelle 0 1>&2 &&exit /b 2  
setlocal enabledelayedexpansion
set "N=1"  
for %%i in (!cells! ) do if %%~i lss !N! (echo FEHLER: folgende Zellenauswahl kleiner^^! & exit /b 2) else (set /a "N=%%~i") ||exit /b 2  
endlocal

if defined T set "T=%T:~0,1%"  
if not defined T set "T= "   
if defined Outfile (set "Um=>") else set "Um="  
%Um% %OUTFILE% (
for /f usebackqDelims^=^ eol^= %%i in ("%Infile%") do (  
	set Line="%%i"  
	set "cell=0"  
	set "incell=0"  
	set "check=1"  
	call :ReadCell %cells%
	echo(
)
)
goto :eof

:ReadCell
if %incell% neq 0 if %incell% equ %1 (
	<nul set /p ="  
	if "%2" equ "" goto :eof  
	<nul set /p ="%T%"  
	set /a "cell =%2-%1"  
	shift
) 
if %cell% equ 0 set /a cell =%1
2>nul set /a x=1/((cell-1)/30) && set /a Cell -=30 , Token=30 || set /a Token=Cell
set /a incell +=Token
setlocal enabledelayedexpansion
if defined check set "Line=!Line:%T%="%T%"!"  
for /f "Tokens=%Token%* delims=%T%" %%a in ("!Line!") do endlocal&(set "Line=%%b"  
	if %incell% equ %1 <nul set /p ="%%~a"  
	set "ChecK="  
	goto :ReadCell
)

Dazu nochmal ein Test auf der CMD-Line:
> >datei (for %i in (a b c d e f g h i k l m n o p q r s t u ) do @(for /l %a in (1 1 300) do @(<nul set /p "=Zeile %i-Spalte %a;")) &echo()

>CSV-extrakt datei /C: 73 201
Zeile a-Spalte 73;Zeile a-Spalte 201
Zeile b-Spalte 73;Zeile b-Spalte 201
Zeile c-Spalte 73;Zeile c-Spalte 201
Zeile d-Spalte 73;Zeile d-Spalte 201
Zeile e-Spalte 73;Zeile e-Spalte 201
Zeile f-Spalte 73;Zeile f-Spalte 201
Zeile g-Spalte 73;Zeile g-Spalte 201
Zeile h-Spalte 73;Zeile h-Spalte 201
Zeile i-Spalte 73;Zeile i-Spalte 201
Zeile k-Spalte 73;Zeile k-Spalte 201
Zeile l-Spalte 73;Zeile l-Spalte 201
Zeile m-Spalte 73;Zeile m-Spalte 201
Zeile n-Spalte 73;Zeile n-Spalte 201
Zeile o-Spalte 73;Zeile o-Spalte 201
Zeile p-Spalte 73;Zeile p-Spalte 201
Zeile q-Spalte 73;Zeile q-Spalte 201
Zeile r-Spalte 73;Zeile r-Spalte 201
Zeile s-Spalte 73;Zeile s-Spalte 201
Zeile t-Spalte 73;Zeile t-Spalte 201
Zeile u-Spalte 73;Zeile u-Spalte 201

>

[Edit]
Trennzeichenauswahl eingefügt.
[/Edit]

Gruß Phil
Knorkator
Knorkator 27.09.2012 um 13:41:09 Uhr
Goto Top
Mit der Powershell kann man zumindest den 2. Teil Deiner Frage schnell lösen.
Import-Csv C:\Test\beispiel.csv -Delimiter `t | select Stunde, Dienstag |  Export-csv c:\Test\Ergebnis.txt -Delimiter `t -NoTypeInformation -Encoding Unicode
Import Unterscheidung per -Delimiter ";" oder -Delimiter "," oder -Delimiter `t
http://powershell.n3tblog.de/2009/09/09/import-csv/

Der 1. Teil lässt sich auch damit lösen, allerdings kenne ich keine Möglichkeit, Spalte 121-144 ohne viel Schreibaufwand zu integrieren. Evtl. hat ja da noch nen PS Profi einen Tipp, würde mich auch interessieren.