Shellsec

Fuld version: PS- eller BAT-script til sletning af data i CSV
Du ser lige nu en skrabet udgave af vores indhold. Se den fulde version med ordentlig formatering.
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.
hvad står der i den sidste linje af csv filen?
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
Kode:
function Remove-Last() {
   begin { $l = $null }
   process { if ($l -ne $null) { $l } $l = $_ }
}

Get-Content $args[0] | Remove-Last
(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.
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>