Vraag Hoe kan ik een CSV-bestand maken van een directorylijst met meerdere kolommen op basis van de bestandsnamen?


Ik heb een lijst met afbeeldingsbestanden, dit zijn scans van kwitanties. Ze zien er als volgt uit:

gas_20160710_3432.jpg
gas_20160810_242.jpg
water_20161004_4510.jpg

Ik wil graag de lijst met bestanden kunnen maken en deze in een CSV-bestand kunnen veranderen, wat ik met de opdracht kan doen 'ls' > files.csv.

Ik heb er echter voor gezorgd dat de bestandsnamen een beetje informatie bevatten over de inhoud en ik zou de bestandsnamen willen parseren, zodat ik gemakkelijker met de gegevens kan werken bij het bewerken van het CSV-bestand in LibreOffice Calc.

Elke bestandsnaam heeft het type ontvangstbewijs, vervolgens de datum in JJJJMMDD-indeling en vervolgens een geldbedrag dat op het ticket is geschreven. Dus ik wil die informatie graag in verschillende kolommen onderverdelen, evenals een kolom met de volledige bestandsnaam. Het eindresultaat zou er dus als volgt uit moeten zien:

enter image description here

Er is ook een ander probleem. De datum moet worden geconverteerd van JJJJMMDD naar JJJJ-MM-DD. Zonder de streepjes lijkt LibreOffice Calc in de war te raken.

Is er een manier om het CSV-bestand te maken dat ik wil uit de inhoud van de map vanaf de opdrachtregel?

Merk op dat er geen andere bestanden in de directory staan ​​dan de bonusscans, zodat er geen filtering van bestandstypen of exclusief bestanden met verschillend geformatteerde namen hoeft te zijn.


1
2018-01-26 06:08


oorsprong




antwoorden:


Perl gebruiken:

ls | perl -pe 's/(.)(.*)_(\d{4})(\d{2})(\d{2})_(\d+).jpg/\u$1$2,$3-$4-$5,$6,$&/'

In perl, (...) wordt gebruikt om overeenkomende tekst te groeperen, dus (.) is een groep met een enkel karakter, (.*) is een groep met een willekeurige reeks, (\d{2}) is een groep met twee cijfers (\d is een cijfer, en {2} geeft twee van de vorige aan) enzovoort. \u converteert het volgende atoom naar hoofdletters. $1, $2, ... zijn de verschillende groepen op volgorde. $& bevat de volledige overeenkomende tekst.

Output:

Gas,2016-07-10,3432,gas_20160710_3432.jpg
Gas,2016-08-10,242,gas_20160810_242.jpg
Water,2016-10-04,4510,water_20161004_4510.jpg

U kunt de headers onafhankelijk toevoegen.


2
2018-01-26 06:15



Werkte als een charme, bedankt. De enige dingen die me opviel, waren dat ik moest toevoegen . filename.csv aan het einde van het commando om de uitvoer daadwerkelijk in een CSV-bestand te krijgen. Om redenen die ik niet helemaal begrijp, werd de naam van het CSV-bestand ook opgenomen in de CSV zelf. Ik denk dat het het bestand maakt voordat het wordt gevuld. Maar geen grote deal. Ik heb zojuist het bestand zo nodig na het maken bewerkt. Deze opdracht heeft me veel werk bespaard! - Questioner
@Questioner ja, als je dat doet > filename.csv, het bestand wordt als eerste aangemaakt. U kunt het in een andere map opslaan, bijvoorbeeld: > ../filename.csv voor opslaan in de bovenliggende map. - muru
Gewoon nog een briefje. Toen ik het resulterende CSV-bestand in LibreOffice Calc opende, worden de datumvelden gemarkeerd als tekst, met een apostrofkarakter in de cel dat niet zichtbaar is, behalve als u de cel bewerkt. Tenminste, in LibreOffice Calc. Ik weet niet of die opmaakoptie het resultaat is van deze opdracht of het conversieproces van LibreOffice Calc. Ik heb een manier gevonden om dit op te lossen hier. - Questioner
@Questioner het is het resultaat van een gebrek van de conversie - standaard neemt Calc de tekst aan, dus u moet deze op datum instellen (YMD): i.stack.imgur.com/w2MWC.png - muru