Tråd bedømmelse:
  • 0 Stemmer - 0 Gennemsnit
  • 1
  • 2
  • 3
  • 4
  • 5
PS- eller BAT-script til sletning af data i CSV
23-02-2018, 14:06 (Denne besked var sidst ændret: 23-02-2018, 14:08 af leoodad.)
#1
PS- eller BAT-script til sletning af data i CSV
Hej,

Jeg er ny i forum, så hej med Jer :)
Jeg står med den udfordring at jeg har noget SQL kode som genererer en *.csv fil. Hver gang denne *.csv fil genereres, dannes der en linje i bunden som ikke skal anvendes senere i et forløb. Derfor søger jeg en som kan være behjælpelig med et script (OBS! Skal kunne afvikles i PS eller CMD), som altid kan slette sidste linje i filen, eller sørge for at slette alt data i sidste linje i filen. Jeg er kommet frem til følgende *.bat script, som er hugget direkte fra nettet, hvilket virker. Den sletter dog ikke den sidste linje, men sørger for at slette alt data i den sidste linje, så den står blank.

Kode:
@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_CSV_FILE=D:\Mappe1\Navnpaafil_230218.csv" & rem // (specify CSV file here; `%~1` is first argument)
set "_NUM_FRST=0"   & rem // (specify number of lines to remove from beginning)
set "_NUM_LAST=1"  & rem // (specify number of lines to remove from end)

rem // Count number of available lines in file:
for /F %%C in ('^< "%_CSV_FILE%" find /C /V ""') do set /A "COUNT=%%C"
set /A "COUNT-=_NUM_LAST"
rem /* Process file, regarding and maintaining empty lines;
rem    lines must be shorter than about 8190 bytes: */
set /A "INDEX=0"
for /F "delims=" %%L in ('findstr /N "^" "%_CSV_FILE%" ^& ^> "%_CSV_FILE%" rem/') do (
    set /A "INDEX+=1"
    set "LINE=%%L"
    setlocal EnableDelayedExpansion
    if !INDEX! GTR %_NUM_FRST% if !INDEX! LEQ %COUNT% >> "!_CSV_FILE!" echo(!LINE:*:=!
    endlocal
)

endlocal
exit /B

Ovenstående virker og kan i realiteten bruges, men der er en lille ting som driller. Den *.csv fil (Navnpaafil_230218.csv) får en ny dato i navnet hver dag, med et dato stempel. Derfor har jeg behov for at wildcard, istedet for dato-navnet i scriptet. Jeg har forsøgt med stjerne (*) og spørgsmålstegn (?), dog uden hjælp. Nogen der lige har et skarpt bud på et andet script, eller blot lige kender tricket med at indsætte et wildcard, så vil jeg live meget glad. På forhånd tak.
Find alle beskeder fra denne bruger
Citer denne besked i et svar
24-02-2018, 12:31 (Denne besked var sidst ændret: 24-02-2018, 12:32 af Spagnum.)
#2
RE: PS- eller BAT-script til sletning af data i CSV
hvad står der i den sidste linje af csv filen?
Don't learn to hack, hack to learn
Find alle beskeder fra denne bruger
Citer denne besked i et svar
24-02-2018, 13:23 (Denne besked var sidst ændret: 24-02-2018, 13:34 af r2Ed.)
#3
RE: PS- eller BAT-script til sletning af data i CSV
Du kan med fordel benytte sed fra cygwin sammen med de få dll filer som det kræver, og lave en bat fil med:
sed -i '$ d' <filnavn>

edit:
Hvis du vil lave noget selvstændigt uden at have det fulde cygwin liggende så skal du bruge disse dll filer sammen med sed.exe
ldd sed.exe
        ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffdb2920000)
        KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ffdb0710000)
        KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ffdaf1c0000)
        cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000)
        cygintl-8.dll => /usr/bin/cygintl-8.dll (0x3ffad0000)
        cygiconv-2.dll => /usr/bin/cygiconv-2.dll (0x3ffaf0000)

Det kan godt ske at du skal have path med når du laver sed kommandoen fra kommando prompt - i så fald vil det være noget ala /cygdrive/c/foo for c:\foo
Find alle beskeder fra denne bruger
Citer denne besked i et svar
25-02-2018, 15:15
#4
RE: PS- eller BAT-script til sletning af data i CSV
Kode:
function Remove-Last() {
   begin { $l = $null }
   process { if ($l -ne $null) { $l } $l = $_ }
}

Get-Content $args[0] | Remove-Last
Find alle beskeder fra denne bruger
Citer denne besked i et svar
26-02-2018, 09:33 (Denne besked var sidst ændret: 26-02-2018, 09:35 af leoodad.)
#5
RE: PS- eller BAT-script til sletning af data i CSV
(24-02-2018, 12:31)Spagnum Skrev: hvad står der i den sidste linje af csv filen?

Der er en pil som pege mod højre hvis man åbner *.csv filen i notepad. Åbner man det i Notepad++ så ser man bare at der står SUB, se evt. her:

https://imgur.com/a/JczT2

(25-02-2018, 15:15)BlimBlamBlar Skrev:
Kode:
function Remove-Last() {
   begin { $l = $null }
   process { if ($l -ne $null) { $l } $l = $_ }
}

Get-Content $args[0] | Remove-Last

Skal jeg antage at det fungerer, ved at køre det i PS? Jeg er ingen haj til PS, og har behov for hele scriptet.
Find alle beskeder fra denne bruger
Citer denne besked i et svar
26-02-2018, 13:33
#6
RE: PS- eller BAT-script til sletning af data i CSV
Put ovenstående i et script (f.eks. kaldet remove-last.ps1) og eksekver det mod en fil:

Kode:
PS /tmp> Get-Content ./remove-last.ps1                                          
function Remove-Last() {
   begin { $l = $null }
   process { if ($l -ne $null) { $l } $l = $_ }
}

Get-Content $args[0] | Remove-Last
PS /tmp> Get-Content ./some_file                                                
first
second
third
last
PS /tmp> ./remove-last.ps1 ./some_file                                          
first
second
third
PS /tmp>
Find alle beskeder fra denne bruger
Citer denne besked i et svar
« Ældre | Nyere »




User(s) browsing this thread: 1 Gæst(er)