Calcola rapidamente le linee aggiunte e rimosse

2

Sto provando a confrontare due file di testo. Voglio calcolare quante linee sono state aggiunte e rimosse. Fondamentalmente cosa sta facendo git diff --stat . Punti bonus per non dover memorizzare l'intero contenuto del file in memoria.

L'approccio che sto attualmente considerando è:

  1. legge ogni riga del vecchio file
  2. calcola un hash (probabilmente MD5 o SHA-1) per ogni riga
  3. memorizza gli hash in un set
  4. fa lo stesso per ogni riga nel nuovo file
  5. ogni hash dal vecchio set di file che manca nel nuovo set di file è stato rimosso
  6. ogni hash del nuovo set di file che manca nel vecchio set di file è stato aggiunto

Probabilmente vorrò escludere le linee vuote e tutte le linee bianche. C'è un piccolo problema con le linee duplicate. Questo può essere risolto memorizzando anche la frequenza con cui appare un hash o confrontando il numero di linee nel vecchio e nel nuovo file e regola le linee aggiunte o rimosse in modo che i numeri si sommino.

Vedi spazio per miglioramenti o un approccio migliore?

Modifica

Attualmente sto usando Java e la libreria SVNKit.

    
posta Philippe Marschall 29.10.2012 - 11:11
fonte

3 risposte

5

Poiché questo è qualcosa di abbastanza diffuso tra gli strumenti diff, perché non utilizzare una libreria diff collaudata per eseguire il lavoro in modo efficiente invece di distribuire il proprio codice?

La ricerca di "diff library" o "diff tools" con il nome della lingua fornirebbe alcuni modi più semplici.

    
risposta data 29.10.2012 - 11:44
fonte
0

Esiste un comando diffstat (di solito nel pacchetto diffstat nella maggior parte delle distribuzioni Linux), che può aiutarti a raggiungere questo obiettivo:

svn diff | diffstat

Questo produce più o meno lo stesso di git diff --stat

Se questa non è un'opzione per te, allora forse una buona alternativa è analizzare l'output di svn diff : conta le righe che iniziano con + e - , tieni presente che per ogni file interessato ci sarà essere linee che iniziano con +++ e --- .

    
risposta data 29.10.2012 - 17:56
fonte
0

perché non farlo:

  1. legge ogni riga del vecchio file
  2. non c'è 2
  3. memorizza le linee in un set
  4. fa lo stesso per ogni riga nel nuovo file
  5. ogni riga dal vecchio set di file che manca nel nuovo set di file è stato rimosso
  6. ogni riga dal nuovo set di file che manca nel vecchio set di file è stato aggiunto

Non vedo alcuna necessità di calcolare gli hash, se hai intenzione di confrontare le cose potresti anche confrontare le linee attuali.

    
risposta data 11.08.2014 - 11:39
fonte

Leggi altre domande sui tag