Script eller dylikt som editerar en text-fil automatiskt

Permalänk

Script eller dylikt som editerar en text-fil automatiskt

Hej,

Jag får ut en textfil som har en viss "struktur"(se nedan). ********EDIT: Det skall vara tabb mellanvarje "kollumn". Såg att det inte syns när jag postar*****
1 3 16.0703205056 59.5786464253 265.6174011230 -2.2583683701 -3.4172589397 -3.4172589397
2 3 16.0703225044 59.5786437284 265.7868347168 -2.2829280788 -3.3391820720 -3.4172589397
3 3 16.0703218045 59.5786271305 265.7586059570 -2.2169142070 -3.4092745413 -3.4172589397
4 3 16.0703318084 59.5786197231 266.1791687012 -2.1624833678 -3.1579238951 -3.4172589397
5 3 16.0703303045 59.5786356336 266.8054809570 -2.1583863586 -3.2783882150 -3.4172589397
OSV...

Jag skulle vilja ändra på textfilen automatiskt(eller semi automatiskt) så jag slipper editera den manuellt så den ser ut på följande sätt.
DSC00200.JPG 16.0703205056 59.5786464253 265.6174011230 -2.2583683701 -3.4172589397 -3.4172589397
DSC00201.JPG 16.0703225044 59.5786437284 265.7868347168 -2.2829280788 -3.3391820720 -3.4172589397
DSC00202.JPG 16.0703218045 59.5786271305 265.7586059570 -2.2169142070 -3.4092745413 -3.4172589397
DSC00203.JPG 16.0703318084 59.5786197231 266.1791687012 -2.1624833678 -3.1579238951 -3.4172589397
DSC00204.JPG 16.0703303045 59.5786356336 266.8054809570 -2.1583863586 -3.2783882150 -3.4172589397
OSV...

Nummreringen "DSC00200.JPG" kan variera men den kommer alltid börja med DSC och en siffra. Sedan stiger det.

Vilket sätt skulle ni rekommendera? Finns det något program som jag skulle kunna använda?

Tack på förhand!

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Hedersmedlem

Excel (eller liknande) är kanske snabbast?

Permalänk
Medlem

PS D:\> (Get-Content '.\text data') | %{ $dsf = $_ -match "^(\d)+"; $old_id = $matches[0]; $_ -replace "^$old_id", (&{ param($old_id) "Hitta rätt DSC00 namn för $old_id"} $old_id) }

I Powershell. Exakt hur kartan från siffrorna i första filen till bildnamnen ser ut är svårt att gissa. Är bilderna alltid i följd blir det lättare

EDIT: Buggfix.

Visa signatur

.<

Permalänk
Medlem

awk är en enkel lösning om du jobbar i en *nix miljö iaf:

awk -F'\t' 'BEGIN{offset=200}{printf "DSC%05d.JPG", offset; print " "$3" "$4" "$5" "$6" "$7" "$8}{offset++}' list.txt

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Hedersmedlem
Skrivet av Zevon:

awk är en enkel lösning om du jobbar i en *nix miljö iaf:

awk -F'\t' 'BEGIN{offset=200}{printf "DSC%05d.JPG", offset; print " "$3" "$4" "$5" "$6" "$7" "$8}{offset++}' list.txt

Mer awk:

Mellanrummet mellan olika fält i print-kommandots argument separeras med OFS ("output field separator"), vilken som standard är just ett mellanslag. Vi kan alltså ta bort explicita mellanslag och i stället skriva:

awk -F'\t' 'BEGIN{offset=200}{printf "DSC%05d.JPG ", offset; print $3, $4, $5, $6, $7, $8}{offset++}' list.txt

++-operationen returnerar originalvärdet av variabeln innan den ökas, så vi kan lika gärna skriva:

awk -F'\t' 'BEGIN{offset=200}{printf "DSC%05d.JPG ", offset++; print $3, $4, $5, $6, $7, $8}' list.txt

awk använder som standard "whitespace" som standardfältavskiljare, så om vi kan anta att input inte kommer innehålla oväntade blanksteg så behöver vi inte specificera fältavskiljare:

awk 'BEGIN{offset=200}{printf "DSC%05d.JPG ", offset++; print $3, $4, $5, $6, $7, $8}' list.txt

Vi kan låta print skriva ut hela strängen med korrekt fältavskiljare genom att sköta interpolationen i sprintf:

awk 'BEGIN{offset=200}{print sprintf("DSC%05d.JPG", offset++), $3, $4, $5, $6, $7, $8}' list.txt

Om vi bara vill sätta initiala variabler så kan vi ge dem som kommandoradsväxlar i stället för att använda BEGIN-blocket:

awk -voffset=200 '{print sprintf("DSC%05d.JPG", offset++), $3, $4, $5, $6, $7, $8}' list.txt

Vill vi inte själva behöva hålla reda på antalet fält så kan vi loopa till NF ("number of fields"):

awk -voffset=200 '{printf("DSC%05d.JPG", offset++); for(i=3;i<=NF;++i){printf " %s", $i}; printf ORS}' list.txt

där vi skriver ut en explicit ORS ("output record separator") för att avgränsa raderna korrekt.

Alternativt kan man vara klurig och "nolla" de första fälten och sedan använda $0 som representerar "alla fält", med komplikationen att vi får extra OFS-utskrifter mellan de tomma fälten (dvs extra mellanslag). De kan vi dock kan ta bort med exempelvis sub (notera skillnaden mellan sub och gsub, där det förstnämnda bara agerar på första förekomsten av mönstret på varje rad):

awk -voffset=200 '{$1=$2=""; sub(/ +/, ""); print sprintf("DSC%05d.JPG", offset++), $0}' list.txt

(vilket blir aningens mer generellt om substitutionsmönstret som ges som första argument till sub i stället använder OFS liksom sprintf("%s+", OFS).)

En annan liknande modell vore att ta bort ett fält redan innan vi skickar strängen till awk med hjälp av exempelvis cut och sedan skriva över ett fält med den nya begynnelsesträngen:

cut -f2- list.txt | awk -voffset=200 '{$1=sprintf("DSC%05d.JPG", offset++); print}'

(där jag också utnyttjar att print utan argument implicerar print $0). Ifall det bara hade varit ett fält att skriva om hade man inte behövt cut-steget, vilket hade gjort den senaste lösningen än finare, men den är likväl kortast hittills (vill man verkligen golfa så kan man korta ner variabelnamn och strippa en del mellanslag ).

Som crescendo kan vi skriva ut allting tabbseparerat som endera

awk -voffset=200 -vOFS='\t' '{$1=$2=""; sub(sprintf("%s+", OFS), ""); print sprintf("DSC%05d.JPG", offset++), $0}' list.txt

eller

cut -f2- list.txt | awk -voffset=200 -vOFS='\t' '{$1=sprintf("DSC%05d.JPG", offset++); print}'

Stavning.
Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Skrivet av Elgot:

Excel (eller liknande) är kanske snabbast?
http://i.imgur.com/ZzFo45M.png

Tack.

Jo jag har prövat det och det skulle kunna vara en "nöd lösning" känner jag
har inte lagt ner mycket tid på det eftersom det är något som jag vill visa kunder osv. Så jag letar efter en smidigare lösning men har excell som backup-lösning

Skrivet av oelrich:

PS D:\> (Get-Content '.\text data') | %{ $dsf = $_ -match "^(\d)+"; $old_id = $matches[0]; $_ -replace "^$old_id", (&{ param($old_id) "Hitta rätt DSC00 namn för $old_id"} $old_id) }

I Powershell. Exakt hur kartan från siffrorna i första filen till bildnamnen ser ut är svårt att gissa. Är bilderna alltid i följd blir det lättare

EDIT: Buggfix.

Bilderna är alltid i följd

Det finns inte ett mera grafiskt program som man skulle kunna använda? Jag kan ännu ingen kodning
Jag tror dock att jag har tagit mig vatten över huvudet.

Det jag skulle behöva är egentligen att man skulle kunna ta in textfilen med strukturen som jag visade och sedan ange kanske ett startnummer. Sedan skall den spotta ut en editerad textfil med bildnamnen istället.

Vad tror ni det skulle kosta om man skulle ta fram en sådan lösning?

Skrivet av Zevon:

awk är en enkel lösning om du jobbar i en *nix miljö iaf:

awk -F'\t' 'BEGIN{offset=200}{printf "DSC%05d.JPG", offset; print " "$3" "$4" "$5" "$6" "$7" "$8}{offset++}' list.txt

Det finns inte ett mera grafiskt program som man skulle kunna använda? Jag kan ännu ingen kodning
Jag tror dock att jag har tagit mig vatten över huvudet.

Det jag skulle behöva är egentligen att man skulle kunna ta in textfilen med strukturen som jag visade och sedan ange kanske ett startnummer. Sedan skall den spotta ut en editerad textfil med bildnamnen istället.

Vad tror ni det skulle kosta om man skulle ta fram en sådan lösning?

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Medlem

Fick för mig att leka lite med de mer visuella delarna i PS under lunchen.
Kopiera koden från &{ till } och klistra in i Powershell. Tryck på enter en eller två gånger och så borde det hoppa upp en dialog som ber dig om den första filen. Den med textrader. Kodsnutten bryr sig inte om hur den ser ut egentligen, men kraschar antagligen om det inte är en textfil. Antalet rader räknas och en ny dialog öppnas där man väljer de bilder som skall passas in i första filen. Antalet bilder måste vara lika många som antalet rader i första filen.

Filen med textraderna sorteras och samma gäller för uppsättningen bilder. Är det lika många rader och bilder utgår skriptet ifrån att första raden (efter sortering) skall matchas mot första bilden (efter sortering). Dubbelkolla resultatet.

&{ [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null; $file = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select data file"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.filename }; if($file) { $data = (Get-Content $file); if($data) { $images = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select $($data.Length) images"; $OpenFileDialog.MultiSelect = $TRUE; $OpenFileDialog.filter = "JPG (*.jpg)| *.jpg|All files (*.*)|*.*"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.FileNames | %{ $path_length = $_.LastIndexOf('\') + 1; $_.Substring($path_length) | sort } }; if($data.Length -eq $images.Length) { $result = @() for($ii = 0; $ii -le $data.Length; $ii++) { $result += $data[$ii] -replace "^(\d)+", $images[$ii]; }; $result | Out-File "$($file).proc" } else { Write-Host "Inte samma antal filer som rader i textfil ..." } } else { Write-Host "Ogiltig fil ..." } } else { Write-Host "Ingen fil ..." } }

Visa signatur

.<

Permalänk
Medlem
Skrivet av longbottom:

Tack.

Jo jag har prövat det och det skulle kunna vara en "nöd lösning" känner jag
har inte lagt ner mycket tid på det eftersom det är något som jag vill visa kunder osv. Så jag letar efter en smidigare lösning men har excell som backup-lösning

Bilderna är alltid i följd

Det finns inte ett mera grafiskt program som man skulle kunna använda? Jag kan ännu ingen kodning
Jag tror dock att jag har tagit mig vatten över huvudet.

Det jag skulle behöva är egentligen att man skulle kunna ta in textfilen med strukturen som jag visade och sedan ange kanske ett startnummer. Sedan skall den spotta ut en editerad textfil med bildnamnen istället.

Vad tror ni det skulle kosta om man skulle ta fram en sådan lösning?
Det finns inte ett mera grafiskt program som man skulle kunna använda? Jag kan ännu ingen kodning
Jag tror dock att jag har tagit mig vatten över huvudet.

Det jag skulle behöva är egentligen att man skulle kunna ta in textfilen med strukturen som jag visade och sedan ange kanske ett startnummer. Sedan skall den spotta ut en editerad textfil med bildnamnen istället.

Vad tror ni det skulle kosta om man skulle ta fram en sådan lösning?

Kostnaden beror väldigt mycket på vem du anlitar. Tar du in en prao som skriver det så blir det billigt, anlitar du ett utvecklingsföretag så blir det dyrt.

Men om du vill passa på att läsa dig programmera lite så är detta ett rätt bra exempel på något som går smidigt att lösa med Python.

Man skulle ju då kunna tänka sig att man först får upp en filväljare där man väljer vilken fil det gäller, talar om var filen som skrivs ska heta. Sedan kanske en fråga om vad första jpg-filnamnet är och så läser man rad för rad, ersätter första biten på varje rad med rätt bildnamn och sedan skriver det i målfilen.

Visa signatur

/M

Permalänk
Medlem
Skrivet av longbottom:

Det jag skulle behöva är egentligen att man skulle kunna ta in textfilen med strukturen som jag visade och sedan ange kanske ett startnummer. Sedan skall den spotta ut en editerad textfil med bildnamnen istället.

awk raden gör redan detta.
list.txt är din textfil, offset=200 sätter startnumret till 200.
För att spara till en fil lista2.txt lägger du till följande i slutet av raden:
>lista2.txt

awk -F'\t' 'BEGIN{offset=200}{printf "DSC%05d.JPG", offset; print " "$3" "$4" "$5" "$6" "$7" "$8}{offset++}' list.txt > lista2.txt

Men vill man köra grafiskt så är det ju enkelt också..
En enkelt och platformsoberoende lösning är ju att skriva skriptet med html+javascript.
Spara följande till ex. konvertera.html och öppna sedan den filen i ex. firefox:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script type="text/javascript"> var IFS='\t'; var OFS='\t'; var fcontents; var offset=0; function convertFile(e) { var file = e.target.files[0]; if (!file) { return; } var reader = new FileReader(); reader.onload = function(e) { var contents = e.target.result; fcontents=contents; updateArea(); }; reader.readAsText(file); document.getElementById("downloadlink").setAttribute("download","new-"+file.name); } function setOffset(v) { offset = parseInt(v); updateArea(); } function updateArea() { var area = document.getElementById("area"); area.value=""; var lines = fcontents.split('\n'); for(var i=0;i<lines.length;i++) { var fields = lines[i].split(IFS); if(fields.length!=8){ continue; } //console.log(fields); var num = (offset+i)+""; var row="DSC"; row+="0".repeat(5-num.length); row+=num; row+=".JPG"; for(var j=2;j<8;j++){ row+=OFS+fields[j]; } area.value+=row+'\n'; } document.getElementById("downloadlink").setAttribute("href",'data:text/plain;charset=utf-8,' + encodeURIComponent(area.value)); } </script> </head> <body> <label>Offset: <input type="number" id="offset" onchange="setOffset(this.value)"></label><br> <label>File: <input type="file" id="file" onchange="convertFile(event);"></label> <a href="" download="" id="downloadlink">Download converted file</a> <br> <textarea id="area" cols="120" rows="30"></textarea> </body> </html>

Är förstås mer som kan gå fel i en sån här lösning än i awk-raden, så ev. finns väl nån bugg.. Men den verkar fungera som den ska iaf.

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk

Hej, här är en lösning i Python som först frågar dig efter ett startnummer i kommandoprompten och sedan låter dig välja en input fil och vart den nya redigerade kopian skall sparas.

import sys import tkinter as tk from tkinter import filedialog def read_text(input_text): output_list = [] for line in input_text.splitlines(): output_list.append(line.split()) return output_list if __name__ == '__main__': while True: try: starting_number = int(input("Startnummer: ")) break except ValueError: print("Skriv in en siffra dumhövve") root = tk.Tk() root.withdraw() print("Välj fil") try: file_path = filedialog.askopenfilename() with open(file_path, 'r') as f: input_text = f.read() except FileNotFoundError: print("Filen hittades inte") sys.exit(1) print("Välj filnamn och vart den genererade filen sparas") try: save_path = filedialog.asksaveasfilename() with open(save_path, 'w') as f: for l in read_text(input_text): #JPG String format "DSC00200.JPG" f.write("DSC{0:05d}.JPG\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\n".format(starting_number, l[2], l[3], l[4], l[5], l[6], l[7])) starting_number += 1 except FileNotFoundError: sys.exit(1)

Koden borde funka både på Linux och Windows men kräver att du har Python 3 installerat på datorn. Öppna en kommandoprompt(powershell eller cmd.exe i Windows) och skriv python --version för att få reda på om Python finns installerat och isåfall vilken version. När python är installerat så är det bara att spara koden ovan till en fil och döpa den till ett namn med filändelsen ".py". För att köra programmet i kommandopromten så måste du först navigera till mappen där det ligger, detta går enkelt att göra med kommandona dir(lista en maps innehåll) och cd(change directory). Man kan även skift-högerklicka i mappen där scriptet är i och välja "Öppna kommandoprompt här..." eller liknande i många versioner av windows.

När du står i mappen där scriptet ligger så kör du det genom att skriva "python filnamn.py".
Finns inte Python 3 på din dator så behöver du ladda ner senaste version här: https://www.python.org/downloads/

Permalänk

Hej,

Tack för alla svar och att ni tog er tid.
jag skall försöka testa med python såfort det är lite lugnare på jobbet.

Tack igen

Skickades från m.sweclockers.com

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Hedersmedlem

*Tråd rensad i enlighet med §9*

Observera att vi ej tillåter annonsering/platsannonser i forumet, se §9:

Citat:

§9 Marknadsföring och annonsering
Forumet får inte användas för annonsering eller marknadsföring av egen eller andras verksamhet. Privatpersoner ska använda Marknad för all slags handel. Det räknas alltid som marknadsföring att sprida länkar som är utformade så att någon tjänar pengar, får poäng eller liknande när de används. Ett annat exempel är platsannonser. För sådana hänvisar vi till vår särskilda jobbavdelning.

/moderator

Visa signatur

Danskjävel så krattar som en skrivare...

Permalänk
Skrivet av Kent:

*Tråd rensad i enlighet med §9*

Observera att vi ej tillåter annonsering/platsannonser i forumet, se §9:
/moderator

Ber om ursäkt.

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk

Häftigt!

Det verkar funka!

Det ser lite konstigt ut för mig när jag öppnar nya text dokumentet med radbryt osv men annars såg det grymt ut!

Riktigt imponerad

Skrivet av Zevon:

awk raden gör redan detta.
list.txt är din textfil, offset=200 sätter startnumret till 200.
För att spara till en fil lista2.txt lägger du till följande i slutet av raden:
>lista2.txt

awk -F'\t' 'BEGIN{offset=200}{printf "DSC%05d.JPG", offset; print " "$3" "$4" "$5" "$6" "$7" "$8}{offset++}' list.txt > lista2.txt

Men vill man köra grafiskt så är det ju enkelt också..
En enkelt och platformsoberoende lösning är ju att skriva skriptet med html+javascript.
Spara följande till ex. konvertera.html och öppna sedan den filen i ex. firefox:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script type="text/javascript"> var IFS='\t'; var OFS='\t'; var fcontents; var offset=0; function convertFile(e) { var file = e.target.files[0]; if (!file) { return; } var reader = new FileReader(); reader.onload = function(e) { var contents = e.target.result; fcontents=contents; updateArea(); }; reader.readAsText(file); document.getElementById("downloadlink").setAttribute("download","new-"+file.name); } function setOffset(v) { offset = parseInt(v); updateArea(); } function updateArea() { var area = document.getElementById("area"); area.value=""; var lines = fcontents.split('\n'); for(var i=0;i<lines.length;i++) { var fields = lines[i].split(IFS); if(fields.length!=8){ continue; } //console.log(fields); var num = (offset+i)+""; var row="DSC"; row+="0".repeat(5-num.length); row+=num; row+=".JPG"; for(var j=2;j<8;j++){ row+=OFS+fields[j]; } area.value+=row+'\n'; } document.getElementById("downloadlink").setAttribute("href",'data:text/plain;charset=utf-8,' + encodeURIComponent(area.value)); } </script> </head> <body> <label>Offset: <input type="number" id="offset" onchange="setOffset(this.value)"></label><br> <label>File: <input type="file" id="file" onchange="convertFile(event);"></label> <a href="" download="" id="downloadlink">Download converted file</a> <br> <textarea id="area" cols="120" rows="30"></textarea> </body> </html>

Är förstås mer som kan gå fel i en sån här lösning än i awk-raden, så ev. finns väl nån bugg.. Men den verkar fungera som den ska iaf.

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Skrivet av oelrich:

Fick för mig att leka lite med de mer visuella delarna i PS under lunchen.
Kopiera koden från &{ till } och klistra in i Powershell. Tryck på enter en eller två gånger och så borde det hoppa upp en dialog som ber dig om den första filen. Den med textrader. Kodsnutten bryr sig inte om hur den ser ut egentligen, men kraschar antagligen om det inte är en textfil. Antalet rader räknas och en ny dialog öppnas där man väljer de bilder som skall passas in i första filen. Antalet bilder måste vara lika många som antalet rader i första filen.

Filen med textraderna sorteras och samma gäller för uppsättningen bilder. Är det lika många rader och bilder utgår skriptet ifrån att första raden (efter sortering) skall matchas mot första bilden (efter sortering). Dubbelkolla resultatet.

&{ [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null; $file = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select data file"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.filename }; if($file) { $data = (Get-Content $file); if($data) { $images = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select $($data.Length) images"; $OpenFileDialog.MultiSelect = $TRUE; $OpenFileDialog.filter = "JPG (*.jpg)| *.jpg|All files (*.*)|*.*"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.FileNames | %{ $path_length = $_.LastIndexOf('\') + 1; $_.Substring($path_length) | sort } }; if($data.Length -eq $images.Length) { $result = @() for($ii = 0; $ii -le $data.Length; $ii++) { $result += $data[$ii] -replace "^(\d)+", $images[$ii]; }; $result | Out-File "$($file).proc" } else { Write-Host "Inte samma antal filer som rader i textfil ..." } } else { Write-Host "Ogiltig fil ..." } } else { Write-Host "Ingen fil ..." } }

Jag skall pröva denna lösningen nu.

Dethär var riktigt kul

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Skrivet av oelrich:

Fick för mig att leka lite med de mer visuella delarna i PS under lunchen.
Kopiera koden från &{ till } och klistra in i Powershell. Tryck på enter en eller två gånger och så borde det hoppa upp en dialog som ber dig om den första filen. Den med textrader. Kodsnutten bryr sig inte om hur den ser ut egentligen, men kraschar antagligen om det inte är en textfil. Antalet rader räknas och en ny dialog öppnas där man väljer de bilder som skall passas in i första filen. Antalet bilder måste vara lika många som antalet rader i första filen.

Filen med textraderna sorteras och samma gäller för uppsättningen bilder. Är det lika många rader och bilder utgår skriptet ifrån att första raden (efter sortering) skall matchas mot första bilden (efter sortering). Dubbelkolla resultatet.

&{ [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null; $file = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select data file"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.filename }; if($file) { $data = (Get-Content $file); if($data) { $images = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select $($data.Length) images"; $OpenFileDialog.MultiSelect = $TRUE; $OpenFileDialog.filter = "JPG (*.jpg)| *.jpg|All files (*.*)|*.*"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.FileNames | %{ $path_length = $_.LastIndexOf('\') + 1; $_.Substring($path_length) | sort } }; if($data.Length -eq $images.Length) { $result = @() for($ii = 0; $ii -le $data.Length; $ii++) { $result += $data[$ii] -replace "^(\d)+", $images[$ii]; }; $result | Out-File "$($file).proc" } else { Write-Host "Inte samma antal filer som rader i textfil ..." } } else { Write-Host "Ogiltig fil ..." } } else { Write-Host "Ingen fil ..." } }

Det fungerade klockrent!
Med risk att låta lite korkad och barnslig så måste jag säga att jag blir helt fashinerad när jag ser att det fungerar )

Skulle det även gå att få bort ettan(1) efter bildnummret?

DSC00074.JPG 1 17.3046877066 62.3952782462 188.8988342285 -13.2648726196 -5.9803410110 -2.7475613709

Tack så mycket!

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Skrivet av blipblorp:

Hej, här är en lösning i Python som först frågar dig efter ett startnummer i kommandoprompten och sedan låter dig välja en input fil och vart den nya redigerade kopian skall sparas.

import sys import tkinter as tk from tkinter import filedialog def read_text(input_text): output_list = [] for line in input_text.splitlines(): output_list.append(line.split()) return output_list if __name__ == '__main__': while True: try: starting_number = int(input("Startnummer: ")) break except ValueError: print("Skriv in en siffra dumhövve") root = tk.Tk() root.withdraw() print("Välj fil") try: file_path = filedialog.askopenfilename() with open(file_path, 'r') as f: input_text = f.read() except FileNotFoundError: print("Filen hittades inte") sys.exit(1) print("Välj filnamn och vart den genererade filen sparas") try: save_path = filedialog.asksaveasfilename() with open(save_path, 'w') as f: for l in read_text(input_text): #JPG String format "DSC00200.JPG" f.write("DSC{0:05d}.JPG\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\n".format(starting_number, l[2], l[3], l[4], l[5], l[6], l[7])) starting_number += 1 except FileNotFoundError: sys.exit(1)

Koden borde funka både på Linux och Windows men kräver att du har Python 3 installerat på datorn. Öppna en kommandoprompt(powershell eller cmd.exe i Windows) och skriv python --version för att få reda på om Python finns installerat och isåfall vilken version. När python är installerat så är det bara att spara koden ovan till en fil och döpa den till ett namn med filändelsen ".py". För att köra programmet i kommandopromten så måste du först navigera till mappen där det ligger, detta går enkelt att göra med kommandona dir(lista en maps innehåll) och cd(change directory). Man kan även skift-högerklicka i mappen där scriptet är i och välja "Öppna kommandoprompt här..." eller liknande i många versioner av windows.

När du står i mappen där scriptet ligger så kör du det genom att skriva "python filnamn.py".
Finns inte Python 3 på din dator så behöver du ladda ner senaste version här: https://www.python.org/downloads/

Jag lyckades få igång programmet men hur gör jag när jag kommer till steget "välj fil"? Jag försökte skriva in sökvägen men det gick inte

Tack!

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Skrivet av oelrich:

Fick för mig att leka lite med de mer visuella delarna i PS under lunchen.
Kopiera koden från &{ till } och klistra in i Powershell. Tryck på enter en eller två gånger och så borde det hoppa upp en dialog som ber dig om den första filen. Den med textrader. Kodsnutten bryr sig inte om hur den ser ut egentligen, men kraschar antagligen om det inte är en textfil. Antalet rader räknas och en ny dialog öppnas där man väljer de bilder som skall passas in i första filen. Antalet bilder måste vara lika många som antalet rader i första filen.

Filen med textraderna sorteras och samma gäller för uppsättningen bilder. Är det lika många rader och bilder utgår skriptet ifrån att första raden (efter sortering) skall matchas mot första bilden (efter sortering). Dubbelkolla resultatet.

&{ [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null; $file = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select data file"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.filename }; if($file) { $data = (Get-Content $file); if($data) { $images = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select $($data.Length) images"; $OpenFileDialog.MultiSelect = $TRUE; $OpenFileDialog.filter = "JPG (*.jpg)| *.jpg|All files (*.*)|*.*"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.FileNames | %{ $path_length = $_.LastIndexOf('\') + 1; $_.Substring($path_length) | sort } }; if($data.Length -eq $images.Length) { $result = @() for($ii = 0; $ii -le $data.Length; $ii++) { $result += $data[$ii] -replace "^(\d)+", $images[$ii]; }; $result | Out-File "$($file).proc" } else { Write-Host "Inte samma antal filer som rader i textfil ..." } } else { Write-Host "Ogiltig fil ..." } } else { Write-Host "Ingen fil ..." } }

Går det på något sätt göra att jag kan "hoppa över" klippa och klistra delen?
DVS att jag tex dubbelklickar på en fil som direkt öppnar powershell och kör scriptet?

Jag försökte spara ner det som en PS1 fil men fick följande meddelenade:
File D:\Data\geodrone\Untitled1.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
At line:0 char:0

tack!

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Medlem
Skrivet av longbottom:

Jag försökte spara ner det som en PS1 fil men fick följande meddelenade:
File D:\Data\geodrone\Untitled1.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
At line:0 char:0

Starta Powershell som admin (högerklick och "Run As Administrator") och skriv följande:
Set-ExecutionPolicy Unrestricted

Du bör även kunna skapa en genväg till följande (om du inte vill tumma på säkerheten med ovanstående policyändring):
powershell.exe -executionpolicy bypass -file C:\PathToScript\Script.ps1

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem

Unrestricted är inte helt bra att ha som default policy. Osäkert.

Andra modellen, med en genväg till Powershell som för den instansen åsidosätter policyn är snyggare.

Om det är en delad dator så är det dock vettigt att se till att det bara är betrodda användare som får skrivrättigheter till skriptet.

Skrivet av longbottom:

Går det på något sätt göra att jag kan "hoppa över" klippa och klistra delen?
DVS att jag tex dubbelklickar på en fil som direkt öppnar powershell och kör scriptet?

Jag försökte spara ner det som en PS1 fil men fick följande meddelenade:
File D:\Data\geodrone\Untitled1.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
At line:0 char:0

tack!

Skrivet av PeCe:

Starta Powershell som admin (högerklick och "Run As Administrator") och skriv följande:
Set-ExecutionPolicy Unrestricted

Du bör även kunna skapa en genväg till följande (om du inte vill tumma på säkerheten med ovanstående policyändring):
powershell.exe -executionpolicy bypass -file C:\PathToScript\Script.ps1

Visa signatur

.<

Permalänk
Medlem
Skrivet av longbottom:

Det fungerade klockrent!
Med risk att låta lite korkad och barnslig så måste jag säga att jag blir helt fashinerad när jag ser att det fungerar )

Skulle det även gå att få bort ettan(1) efter bildnummret?

DSC00074.JPG 1 17.3046877066 62.3952782462 188.8988342285 -13.2648726196 -5.9803410110 -2.7475613709

Tack så mycket!

Missade den lilla detaljen
I första exemplet stod det 3 där, så jag antar att det kan variera?
Den aktiva biten i koden nedan är "^(\d)+\t(\d)+" och tolkas som att man vill matcha mot textrader som börjar med en eller fler siffror följt av ett tab och sedan en eller fler siffror igen. Det är det som sedan byts mot något filnamn. Ursprungliga versionen matchade bara mot första gruppen siffror.

&{ [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null; $file = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select data file"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.filename }; if($file) { $data = (Get-Content $file); if($data) { $images = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select $($data.Length) images"; $OpenFileDialog.MultiSelect = $TRUE; $OpenFileDialog.filter = "JPG (*.jpg)| *.jpg|All files (*.*)|*.*"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.FileNames | %{ $path_length = $_.LastIndexOf('\') + 1; $_.Substring($path_length) | sort } }; if($data.Length -eq $images.Length) { $result = @() for($ii = 0; $ii -le $data.Length; $ii++) { $result += $data[$ii] -replace "^(\d)+\t(\d)+", $images[$ii]; }; $result | Out-File "$($file).proc" } else { Write-Host "Inte samma antal filer som rader i textfil ..." } } else { Write-Host "Ogiltig fil ..." } } else { Write-Host "Ingen fil ..." } }

Visa signatur

.<

Permalänk
Skrivet av PeCe:

Starta Powershell som admin (högerklick och "Run As Administrator") och skriv följande:
Set-ExecutionPolicy Unrestricted

Du bör även kunna skapa en genväg till följande (om du inte vill tumma på säkerheten med ovanstående policyändring):
powershell.exe -executionpolicy bypass -file C:\PathToScript\Script.ps1

Tack!

Jag testar det

Skrivet av oelrich:

Unrestricted är inte helt bra att ha som default policy. Osäkert.

Andra modellen, med en genväg till Powershell som för den instansen åsidosätter policyn är snyggare.

Om det är en delad dator så är det dock vettigt att se till att det bara är betrodda användare som får skrivrättigheter till skriptet.

Jag testar det

Skrivet av oelrich:

Missade den lilla detaljen
I första exemplet stod det 3 där, så jag antar att det kan variera?
Den aktiva biten i koden nedan är "^(\d)+\t(\d)+" och tolkas som att man vill matcha mot textrader som börjar med en eller fler siffror följt av ett tab och sedan en eller fler siffror igen. Det är det som sedan byts mot något filnamn. Ursprungliga versionen matchade bara mot första gruppen siffror.

&{ [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null; $file = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select data file"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.filename }; if($file) { $data = (Get-Content $file); if($data) { $images = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select $($data.Length) images"; $OpenFileDialog.MultiSelect = $TRUE; $OpenFileDialog.filter = "JPG (*.jpg)| *.jpg|All files (*.*)|*.*"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.FileNames | %{ $path_length = $_.LastIndexOf('\') + 1; $_.Substring($path_length) | sort } }; if($data.Length -eq $images.Length) { $result = @() for($ii = 0; $ii -le $data.Length; $ii++) { $result += $data[$ii] -replace "^(\d)+\t(\d)+", $images[$ii]; }; $result | Out-File "$($file).proc" } else { Write-Host "Inte samma antal filer som rader i textfil ..." } } else { Write-Host "Ogiltig fil ..." } } else { Write-Host "Ingen fil ..." } }

Funkar perfekt! Tack!

Försöker nu göra om scriptet till en executable fil

Har ni nå erfarenhet av det? Jag prövade PowerGUI och scriptet verkar fungera fram tills att den skall "spotta ut" filen..
*EDIT: Det var SBS denna gången. Valde fel textfil så antalet bilder och matchade inte. Nu funkar även EXE filen!

Tack åter igen för all hjälp.

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Skrivet av oelrich:

Missade den lilla detaljen
I första exemplet stod det 3 där, så jag antar att det kan variera?
Den aktiva biten i koden nedan är "^(\d)+\t(\d)+" och tolkas som att man vill matcha mot textrader som börjar med en eller fler siffror följt av ett tab och sedan en eller fler siffror igen. Det är det som sedan byts mot något filnamn. Ursprungliga versionen matchade bara mot första gruppen siffror.

&{ [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null; $file = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select data file"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.filename }; if($file) { $data = (Get-Content $file); if($data) { $images = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select $($data.Length) images"; $OpenFileDialog.MultiSelect = $TRUE; $OpenFileDialog.filter = "JPG (*.jpg)| *.jpg|All files (*.*)|*.*"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.FileNames | %{ $path_length = $_.LastIndexOf('\') + 1; $_.Substring($path_length) | sort } }; if($data.Length -eq $images.Length) { $result = @() for($ii = 0; $ii -le $data.Length; $ii++) { $result += $data[$ii] -replace "^(\d)+\t(\d)+", $images[$ii]; }; $result | Out-File "$($file).proc" } else { Write-Host "Inte samma antal filer som rader i textfil ..." } } else { Write-Host "Ogiltig fil ..." } } else { Write-Host "Ingen fil ..." } }

Hej igen,

Skulle det gå att ändra scriptet så att hela rader tas bort beroende på vad som står efter nummreringen?
1 3 16.0703205056 59.5786464253 265.6174011230 -2.2583683701 -3.4172589397 -3.4172589397
2 3 16.0703225044 59.5786437284 265.7868347168 -2.2829280788 -3.3391820720 -3.4172589397
3 1 16.0703218045 59.5786271305 265.7586059570 -2.2169142070 -3.4092745413 -3.4172589397
4 1 16.0703318084 59.5786197231 266.1791687012 -2.1624833678 -3.1579238951 -3.4172589397
5 1 16.0703303045 59.5786356336 266.8054809570 -2.1583863586 -3.2783882150 -3.4172589397

DVS ifall det står en 3:a så tas hela den raden bort. Ifall det står en 1:a så behålls den?
Alt. att den tar bort alla rader tills den kommer till en 1:a. För raderna med en 3:a kommer att vara längst upp.. Och SEDAN köra det scriptet?

Tack!

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Medlem

Hela blocket som följer på $safe_numbers kan bytas mot "1" om man vet att bara ettor någonsin kommer behållas. Eller mot "1|2" om ettor eller tvåor kan behållas. Nuvarande låter en skriva in det i en dialog. Såg roligare ut. Så vill man spara ettor och tvåor i filen skriver man "1, 2" i dialogen.

Koden gör dock inte exakt som du sade. Den bryr sig inte om ordningen, bara om siffrorna. Så om det kan komma treor efter första ettan men att dessa skall behållas så behöver skriptet ändras. Nu plockar det bara ut alla ettor (eller vilka siffror man än säger åt det att behålla).

&{ Add-Type -AssemblyName System.Drawing Add-Type -AssemblyName System.Windows.Forms $file = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select data file"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.filename }; if($file) { $data = (Get-Content $file); if($data) { $safe_numbers = &{ # baserat på https://gist.github.com/jonschoning/5503062 $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Size(10,10) $label.Size = New-Object System.Drawing.Size(100,40) $label.AutoSize = $true $label.Text = "Skriv in de siffror som skall sparas och bytas mot bilder:"; $label2 = New-Object System.Windows.Forms.Label $label2.Location = New-Object System.Drawing.Size(10,30) $label2.Size = New-Object System.Drawing.Size(100,40) $label2.AutoSize = $true $label2.Text = "Om flera, skriv in med komman mellan."; $textBox = New-Object System.Windows.Forms.TextBox; $textBox.Location = New-Object System.Drawing.Size(10,80) $textBox.Size = New-Object System.Drawing.Size(100,20) $textBox.AcceptsReturn = $true; $textBox.AcceptsTab = $false; $textBox.Multiline = $false; $textBox.Text = "1"; $okButton = New-Object System.Windows.Forms.Button; $okButton.Location = New-Object System.Drawing.Size(200,200) $okButton.Size = New-Object System.Drawing.Size(75,25) $okButton.Text = "OK" $okButton.Add_Click({ $form.Tag = $textBox.Text; $form.Close() }); $form = New-Object System.Windows.Forms.Form; $form.Size = New-Object System.Drawing.Size(400,300) $form.Text = "Rader att spara"; $form.Controls.Add($label); $form.Controls.Add($label2); $form.Controls.Add($textBox); $form.Controls.Add($okButton); $form.Add_Shown({$form.Activate()}); $form.ShowDialog() | Out-Null; $form.Tag.Replace(" ", "").Replace(",","|") }; $data = $data | Select-String -Pattern "^(\d)+\t($($safe_numbers))\t" if($data.Length -gt 0) { $images = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select $($data.Length) images"; $OpenFileDialog.MultiSelect = $TRUE; $OpenFileDialog.filter = "JPG (*.jpg)| *.jpg|All files (*.*)|*.*"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.FileNames | %{ $path_length = $_.LastIndexOf('\') + 1; $_.Substring($path_length) | sort } }; if($data.Length -eq $images.Length) { $result = @() for($ii = 0; $ii -le $data.Length; $ii++) { $result += $data[$ii] -replace "^(\d)+\t(\d)+", $images[$ii]; }; $result | Out-File "$($file).proc" } else { [System.Windows.Forms.MessageBox]::Show("Inte samma antal bildfiler som valda rader i textfil.", "Fel") } } else { [System.Windows.Forms.MessageBox]::Show("Inga rader i filen $($file) valdes.", "Fel") } } else { [System.Windows.Forms.MessageBox]::Show("Ogiltig fil.", "Fel") } } else { [System.Windows.Forms.MessageBox]::Show( "Ingen fil valdes.", "Fel") } }

Skrivet av longbottom:

Hej igen,

Skulle det gå att ändra scriptet så att hela rader tas bort beroende på vad som står efter nummreringen?
1 3 16.0703205056 59.5786464253 265.6174011230 -2.2583683701 -3.4172589397 -3.4172589397
2 3 16.0703225044 59.5786437284 265.7868347168 -2.2829280788 -3.3391820720 -3.4172589397
3 1 16.0703218045 59.5786271305 265.7586059570 -2.2169142070 -3.4092745413 -3.4172589397
4 1 16.0703318084 59.5786197231 266.1791687012 -2.1624833678 -3.1579238951 -3.4172589397
5 1 16.0703303045 59.5786356336 266.8054809570 -2.1583863586 -3.2783882150 -3.4172589397

DVS ifall det står en 3:a så tas hela den raden bort. Ifall det står en 1:a så behålls den?
Alt. att den tar bort alla rader tills den kommer till en 1:a. För raderna med en 3:a kommer att vara längst upp.. Och SEDAN köra det scriptet?

Tack!

Visa signatur

.<

Permalänk
Skrivet av oelrich:

Hela blocket som följer på $safe_numbers kan bytas mot "1" om man vet att bara ettor någonsin kommer behållas. Eller mot "1|2" om ettor eller tvåor kan behållas. Nuvarande låter en skriva in det i en dialog. Såg roligare ut. Så vill man spara ettor och tvåor i filen skriver man "1, 2" i dialogen.

Koden gör dock inte exakt som du sade. Den bryr sig inte om ordningen, bara om siffrorna. Så om det kan komma treor efter första ettan men att dessa skall behållas så behöver skriptet ändras. Nu plockar det bara ut alla ettor (eller vilka siffror man än säger åt det att behålla).

&{ Add-Type -AssemblyName System.Drawing Add-Type -AssemblyName System.Windows.Forms $file = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select data file"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.filename }; if($file) { $data = (Get-Content $file); if($data) { $safe_numbers = &{ # baserat på https://gist.github.com/jonschoning/5503062 $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Size(10,10) $label.Size = New-Object System.Drawing.Size(100,40) $label.AutoSize = $true $label.Text = "Skriv in de siffror som skall sparas och bytas mot bilder:"; $label2 = New-Object System.Windows.Forms.Label $label2.Location = New-Object System.Drawing.Size(10,30) $label2.Size = New-Object System.Drawing.Size(100,40) $label2.AutoSize = $true $label2.Text = "Om flera, skriv in med komman mellan."; $textBox = New-Object System.Windows.Forms.TextBox; $textBox.Location = New-Object System.Drawing.Size(10,80) $textBox.Size = New-Object System.Drawing.Size(100,20) $textBox.AcceptsReturn = $true; $textBox.AcceptsTab = $false; $textBox.Multiline = $false; $textBox.Text = "1"; $okButton = New-Object System.Windows.Forms.Button; $okButton.Location = New-Object System.Drawing.Size(200,200) $okButton.Size = New-Object System.Drawing.Size(75,25) $okButton.Text = "OK" $okButton.Add_Click({ $form.Tag = $textBox.Text; $form.Close() }); $form = New-Object System.Windows.Forms.Form; $form.Size = New-Object System.Drawing.Size(400,300) $form.Text = "Rader att spara"; $form.Controls.Add($label); $form.Controls.Add($label2); $form.Controls.Add($textBox); $form.Controls.Add($okButton); $form.Add_Shown({$form.Activate()}); $form.ShowDialog() | Out-Null; $form.Tag.Replace(" ", "").Replace(",","|") }; $data = $data | Select-String -Pattern "^(\d)+\t($($safe_numbers))\t" if($data.Length -gt 0) { $images = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select $($data.Length) images"; $OpenFileDialog.MultiSelect = $TRUE; $OpenFileDialog.filter = "JPG (*.jpg)| *.jpg|All files (*.*)|*.*"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.FileNames | %{ $path_length = $_.LastIndexOf('\') + 1; $_.Substring($path_length) | sort } }; if($data.Length -eq $images.Length) { $result = @() for($ii = 0; $ii -le $data.Length; $ii++) { $result += $data[$ii] -replace "^(\d)+\t(\d)+", $images[$ii]; }; $result | Out-File "$($file).proc" } else { [System.Windows.Forms.MessageBox]::Show("Inte samma antal bildfiler som valda rader i textfil.", "Fel") } } else { [System.Windows.Forms.MessageBox]::Show("Inga rader i filen $($file) valdes.", "Fel") } } else { [System.Windows.Forms.MessageBox]::Show("Ogiltig fil.", "Fel") } } else { [System.Windows.Forms.MessageBox]::Show( "Ingen fil valdes.", "Fel") } }

Stort tack! Funkar klockrent!

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**

Permalänk
Skrivet av oelrich:

Hela blocket som följer på $safe_numbers kan bytas mot "1" om man vet att bara ettor någonsin kommer behållas. Eller mot "1|2" om ettor eller tvåor kan behållas. Nuvarande låter en skriva in det i en dialog. Såg roligare ut. Så vill man spara ettor och tvåor i filen skriver man "1, 2" i dialogen.

Koden gör dock inte exakt som du sade. Den bryr sig inte om ordningen, bara om siffrorna. Så om det kan komma treor efter första ettan men att dessa skall behållas så behöver skriptet ändras. Nu plockar det bara ut alla ettor (eller vilka siffror man än säger åt det att behålla).

&{ Add-Type -AssemblyName System.Drawing Add-Type -AssemblyName System.Windows.Forms $file = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select data file"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.filename }; if($file) { $data = (Get-Content $file); if($data) { $safe_numbers = &{ # baserat på https://gist.github.com/jonschoning/5503062 $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Size(10,10) $label.Size = New-Object System.Drawing.Size(100,40) $label.AutoSize = $true $label.Text = "Skriv in de siffror som skall sparas och bytas mot bilder:"; $label2 = New-Object System.Windows.Forms.Label $label2.Location = New-Object System.Drawing.Size(10,30) $label2.Size = New-Object System.Drawing.Size(100,40) $label2.AutoSize = $true $label2.Text = "Om flera, skriv in med komman mellan."; $textBox = New-Object System.Windows.Forms.TextBox; $textBox.Location = New-Object System.Drawing.Size(10,80) $textBox.Size = New-Object System.Drawing.Size(100,20) $textBox.AcceptsReturn = $true; $textBox.AcceptsTab = $false; $textBox.Multiline = $false; $textBox.Text = "1"; $okButton = New-Object System.Windows.Forms.Button; $okButton.Location = New-Object System.Drawing.Size(200,200) $okButton.Size = New-Object System.Drawing.Size(75,25) $okButton.Text = "OK" $okButton.Add_Click({ $form.Tag = $textBox.Text; $form.Close() }); $form = New-Object System.Windows.Forms.Form; $form.Size = New-Object System.Drawing.Size(400,300) $form.Text = "Rader att spara"; $form.Controls.Add($label); $form.Controls.Add($label2); $form.Controls.Add($textBox); $form.Controls.Add($okButton); $form.Add_Shown({$form.Activate()}); $form.ShowDialog() | Out-Null; $form.Tag.Replace(" ", "").Replace(",","|") }; $data = $data | Select-String -Pattern "^(\d)+\t($($safe_numbers))\t" if($data.Length -gt 0) { $images = &{ $OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog; $OpenFileDialog.RestoreDirectory = $TRUE; $OpenFileDialog.Title = "Select $($data.Length) images"; $OpenFileDialog.MultiSelect = $TRUE; $OpenFileDialog.filter = "JPG (*.jpg)| *.jpg|All files (*.*)|*.*"; $OpenFileDialog.ShowDialog() | Out-Null; $OpenFileDialog.FileNames | %{ $path_length = $_.LastIndexOf('\') + 1; $_.Substring($path_length) | sort } }; if($data.Length -eq $images.Length) { $result = @() for($ii = 0; $ii -le $data.Length; $ii++) { $result += $data[$ii] -replace "^(\d)+\t(\d)+", $images[$ii]; }; $result | Out-File "$($file).proc" } else { [System.Windows.Forms.MessageBox]::Show("Inte samma antal bildfiler som valda rader i textfil.", "Fel") } } else { [System.Windows.Forms.MessageBox]::Show("Inga rader i filen $($file) valdes.", "Fel") } } else { [System.Windows.Forms.MessageBox]::Show("Ogiltig fil.", "Fel") } } else { [System.Windows.Forms.MessageBox]::Show( "Ingen fil valdes.", "Fel") } }

Hej!

Jag har en lite fråga gällande programsnutten du så snallt gjorde för några månader sedan.
Skulle det gå att ändra programmet så att den automatisk byter ut alla kommatecken till punkter i slutet av programmet innan den exporterar?

Skulle det ta lång tid att göra en sådan snutt?

mvh

Visa signatur

**commodore 64** Processor: MOS Technology 6510 @ 0,985 MHz ** Grafik: MOS 6569/8569 ** Ram: 64 KiB (65536 bytes) ** Ljudhårdvara: MOS Technology 6581/8580 "SID" med Oscillatorsynkronisering**