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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 191890
Url: https://administrator.de/contentid/191890
Ausgedruckt am: 22.11.2024 um 13:11 Uhr
4 Kommentare
Neuester Kommentar
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:
Dazu nochmal ein Test auf der CMD-Line:
[Edit]
Trennzeichenauswahl eingefügt.
[/Edit]
Gruß Phil
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
Mit der Powershell kann man zumindest den 2. Teil Deiner Frage schnell lösen.
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.
Import-Csv C:\Test\beispiel.csv -Delimiter `t | select Stunde, Dienstag | Export-csv c:\Test\Ergebnis.txt -Delimiter `t -NoTypeInformation -Encoding Unicode
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.