Skapa ett program: Hitta och namnge ljudfiler

Permalänk
Medlem

Skapa ett program: Hitta och namnge ljudfiler

Hej gott folk!

Jag sitter här med cirka 14 000 numeriska ljudfiler (.wem) och ett dussin textdokument (.txt) som innehåller information om dessa ljudfiler. Mitt mål är att uttnyttja informationen i textdokumenten för att hitta och namnge alla ljudfiler - till detta behövs ett program. Jag är inte kapabel att få det gjort på egen hand och hoppas att någon swec'are kan omvandla mina tankar till fungerande kod. Jag ämnar att köra det i windowsmiljö, bör jag t.ex välja C, C#, C++ eller Python?

För enkelhetens skull har jag valt ett av textdokumenten och kallar det "coleman.txt", en spelkaraktär för den som undrar. Nedan ser du coleman.txt och en lista på de ljudfiler som är hans. Listan följer samma struktur som i det markerade exemplet.

Alla dessa WEM filer liggur huller om buller i en mapp. Se nedan:

Läget just nu:

  • Tonvis med numeriska .wem filer befinner sig i samma mapp med coleman.txt

Detta vill jag åstadkomma:

  • Köra ett program som skannar coleman .txt

  • Programmet ska hitta de numeriska namnen (1) (antalet siffror varierar mellan 6-10 & slutar alltid på .wem)

  • Programmet använder denna data för att hitta de korresponderande .wem filerna i samma mapp

  • Programmet sparar en .wem kopia med det riktiga namnet (2)

Permalänk
Rekordmedlem

Det går att skapa skript i Advanced renamer och det kanske funkar så man slipper göre att helt separat program för det, går även att då hjälp via forumet.
https://www.advancedrenamer.com/

Visa signatur

R5 5600G, Asus ROG STRIX X470-F Gaming, WD SN850X 2TB, Seasonic Focus+ Gold 650W, Aerocool Graphite v3, Tittar på en Acer ET430Kbmiippx 43" 4K. Lyssnar på Behringer DCX2496, Truth B3031A, Truth B2092A. Har också oscilloskop, mätmikrofon och colorimeter.

Permalänk
Medlem

Ändå ganska rolig uppgift att göra även om jag inte är hemma just nu och kan hjälpa dig. Jag hade gjort det i C# men gissar på att det är riktigt smidigt att göra i Python även om det inte är min arena.

Visa signatur

"Happiness is only real when shared"

Permalänk
Medlem

@sebbeharry: Jag hade bara gjort lite search and replace i textfilen tills den blev en .batfil där varje rad gjorde "rename A B"

I linux hade det blivit en one-liner:
cat coleman.txt | awk '{print "mv "$2" "$1}' > rename.sh

För perl eller python är det lätt att hitta ett exempel som läsen fil rad för rad och skriver ut den,
ta din sträng med raden och gör split(' ') och skriv ut motsvarande "mv " följt första och andra elementet så funkar det som awk ovan

Permalänk
Medlem

Jag hade använt Python för detta, förstår inte problemet tillräckligt exakt från din post för att slänga ihop något. Till exempel ser den textfilen rätt skum ut så gissar att line wrapping är på? Går naturligtvis att göra i C++ om man vill men lär ta mycket tid om man inte hittar precis rätt bibliotek för problemet.

Visa signatur

RAID is not a backup

Permalänk
Medlem
Skrivet av Jpau94:

Jag hade använt Python för detta, förstår inte problemet tillräckligt exakt från din post för att slänga ihop något. Till exempel ser den textfilen rätt skum ut så gissar att line wrapping är på? Går naturligtvis att göra i C++ om man vill men lär ta mycket tid om man inte hittar precis rätt bibliotek för problemet.

Ja, det kanske inte är andra och första ordet utan typ femte och fjärde,
här är iaf en ansats i python

import sys with open(sys.argv[1]) as fp: line = fp.readline() while line: words = line.strip().split(' ') print "rename {} {}".format(words[1], words[0]) line = fp.readline()

Permalänk
Medlem

Tack för alla snabba svar! <3 Jag redigerade första inlägget litegrann och hoppas att min idé blev klarare.

Skrivet av sebbeharry:

Ändå ganska rolig uppgift att göra även om jag inte är hemma just nu och kan hjälpa dig. Jag hade gjort det i C# men gissar på att det är riktigt smidigt att göra i Python även om det inte är min arena.

Det är ingen brådska för min del, jag gör det som ett spelmoddningsprojekt, all hjälp uppskattas Sedan om C, C#, C++ eller Python är det bästa vet jag inte.

Skrivet av Jpau94:

Jag hade använt Python för detta, förstår inte problemet tillräckligt exakt från din post för att slänga ihop något. Till exempel ser den textfilen rätt skum ut så gissar att line wrapping är på? Går naturligtvis att göra i C++ om man vill men lär ta mycket tid om man inte hittar precis rätt bibliotek för problemet.

Jag är inte familjär med Python men antar att det går att köra den typen av program på vanilla windows 10? Kan du förklara termen bibliotek för mig? Sitter för tillfället och pillar med Visual Studio.

Skrivet av pacc:

Ja, det kanske inte är andra och första ordet utan typ femte och fjärde,
här är iaf en ansats i python

import sys with open(sys.argv[1]) as fp: line = fp.readline() while line: words = line.strip().split(' ') print "rename {} {}".format(words[1], words[0]) line = fp.readline()

Har noll koll på Python men pseudokod-tänkaren inom mig säger att detta kan modifieras till att hitta textstycken som innehåller siffror och slutar på .wem? (se första inlägget & första bilden, numeriskt namn)

Permalänk
Medlem
Skrivet av Jpau94:

Går naturligtvis att göra i C++ om man vill men lär ta mycket tid om man inte hittar precis rätt bibliotek för problemet.

Challenge accepted! Med endast standard C++:

#include <iostream> #include <fstream> #include <string> #include <regex> #include <filesystem> int main(int argc, char *argv[]) { std::ifstream file(argv[1]); if (!file) { std::cerr << "Couldn't open file" << std::endl; return -1; } const std::regex re("([_\\w]+\\.wem)\\s*([_\\w]+\\.wem)"); std::string line; while (std::getline(file, line)) { std::smatch matches; if (std::regex_search(line, matches, re)) { if (matches.size() == 3) { std::filesystem::rename(matches[2].str(), matches[1].str()); } } } }

Det går säkert att göra med en oneliner i Python, men det blir inte så krångligt i C++ som man skulle kunna tro. Att kompilera koden för Windows lämnar jag dock som en övning för läsaren, eftersom jag inte använder det OS:et. Och skulle TS vara våghalsig nog att köra koden så rekommenderar jag starkt att ta backup på filerna först

Permalänk
Medlem
Skrivet av Navicula:

Tack för alla snabba svar! <3 Jag redigerade första inlägget litegrann och hoppas att min idé blev klarare.

Det är ingen brådska för min del, jag gör det som ett spelmoddningsprojekt, all hjälp uppskattas Sedan om C, C#, C++ eller Python är det bästa vet jag inte.

Jag är inte familjär med Python men antar att det går att köra den typen av program på vanilla windows 10? Kan du förklara termen bibliotek för mig? Sitter för tillfället och pillar med Visual Studio.

Har noll koll på Python men pseudokod-tänkaren inom mig säger att detta kan modifieras till att hitta textstycken som innehåller siffror och slutar på .wem? (se första inlägget & första bilden, numeriskt namn)

Du måste installera Python. I och med att det är ett skriptspråk som tolkas så måste du ha något som kan köra programmet.
Bibliotek (library) är återanvändbar kod som man kan inkludera i program. Ex. standardbiblioteket.
Om dina textfiler har ett standard format där filnamnet alltid finns i kolumn x så hade jag nog hellre gått på det än på regex eller liknande men det är nog mycket en smaksak.

Skrivet av perost:

Challenge accepted! Med endast standard C++:

<lösning>

Det går säkert att göra med en oneliner i Python, men det blir inte så krångligt i C++ som man skulle kunna tro. Att kompilera koden för Windows lämnar jag dock som en övning för läsaren, eftersom jag inte använder det OS:et. Och skulle TS vara våghalsig nog att köra koden så rekommenderar jag starkt att ta backup på filerna först

Intressant, visste inte om den där std::filesystem alls. Tack

Visa signatur

RAID is not a backup