Odszukiwanie i kopiowanie wybranych danych

0

O co chodzi?
Mam 2 listy: najnowsze i piosenki. W tej pierwszej są zawarte numery wybranych piosenek, a w drugiej informacje wszystkich piosenek. Problem polega na tym, aby skopiować adresy tylko plików z listy najnowsze. Niby proste, ale dosyć kłopotliwe.

Przykładowo:
z pierwszej listy mamy: <key>Track ID</key><integer>6889</integer>
a z drugiej:

<key>6889</key>
                <dict>
                        <key>Track ID</key><integer>6889</integer>
                        <key>Name</key><string>492 - Santana - Evil Ways</string>
                        <key>Artist</key><string>Various Artists</string>
                        <key>Album</key><string>Bacobens Rock Top 500</string>
                        <key>Genre</key><string>Rock</string>
                        <key>Part of Gapless Album</key><false/>
                        <key>Compilation</key><false/>
                        <key>Track Type</key><string>File</string>
                        <key>Date Added</key><date>2011-05-30'T'21:40:42</date>
                        <key>Date Modified</key><date>2008-10-09'T'00:54:36</date>
                        <key>Location</key><string>file://localhost/D%3A/ipod/Music/Various%20Artists/Bacobens%20Rock%20Top%20500/492%20%2D%20Santana%20%2D%20Evil%20Ways%2Emp3</string>
                </dict> 

i tylko interesuje nas 2 ostatnie linijki czyli adres piosenki :)

Problem?
Doszedłem do momentu, gdzie mamy wpisane w tablicę numery piosenek co nas interesują. Z kopiowaniem adresu zaczyna być problem, bo kopiuje adres tylko 1 piosenki i do tego nie patrzy na jej numer.

W załączniku źródła + listy

Kod całego programu:

 unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StrUtils;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Memo3: TMemo;
    Button2: TButton;
    Memo4: TMemo;
    Button3: TButton;
    Memo5: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  a : String;
  d,w:array[0..1000] of String;
  j:Integer;
implementation

{$R *.dfm}


function EN( sChaine: String ): String ;   //rozpoznawanie liczb
var                                        //zamienianie wszystkiego oprocz liczb na ,
i: Integer ;
begin
Result := '' ;
for i := 1 to length( sChaine ) do
begin
if sChaine[i] in ['0'..'9'] then
Result := Result + sChaine[i]
else Result := Result + ',';
end ;
end ;


procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin

Memo2.Lines.Add(EN(Memo1.Lines.Text));


end;

procedure TForm1.Button2Click(Sender: TObject);    //dodawanie interesujacych nas liczb do tablicy
var i: Integer;

begin
a:=Memo2.Lines.Text;
j:=0;



for i:=1 to length(Memo2.Lines.Text) do
begin
 if a[i] <> ',' then
  begin
   d[j]:= d[j]+a[i];
   if Memo2.Lines.Text[i+1] = ',' then j:=j+1;
  end;
end;

for i:=0 to j do Memo3.Lines.Add(d[i]);
end;


procedure TForm1.Button3Click(Sender: TObject);    //kopiowanie adresow z memo4
var i,k,x,l : Integer;
b:String;
begin
b:= Memo4.Lines.Text;
l:=0;
//Memo5.Lines.Add(IntToStr(j));

for l:= 0 to j do
begin
//Memo5.Lines.Add(IntToStr(x));

for x:=PosEx('file://',b,Pos(d[l],b)) to PosEx('</string>',b,PosEx('file://',b,Pos(d[l],b)))-1 do
 begin
 w[l] := w[l] + b[x];
 end;


 end;


for i:= 0 to l do Memo5.Lines.Add(w[i]);
// Memo5.Lines.Add(IntToStr(l));
end;
end.

1

Imiennicy muszą sobie pomagać :) Jednak Ty chyba jesteś początkujący nie tylko na forum, bo taka metoda parsowania pliku i wydobycia z niego samych cyfr jaką próbowałeś zasotoswać jest niestety do niczego, ponieważ będzie trwać wieki. Nie udalo mi się załadować plików jakie dołączyłeś do parsera XML Spooka, dlatego skorzystałem z najprostszego wyjścia czyli modułu do wyrażeń regularnych ze strony: http://regexpstudio.com natomiast kod do załadowania plików Unicode wziałem z: http://www.delphipages.com/forum/showthread.php?t=165093 a cały program po wcześniejszym przetestowaniu pod VCL przeniosłem do konsoli. Misiekd pewnie by stwierdzuł, bo ma ogromną i większą wiedzę ode mnie, że te wyszukanie na TStringList pewnie da się zrobić inaczej, ale ja zrobiłem tak jak widać. Wyniki są sortowane rosnąco według ID z linku, a wszystko jest zapisywane do wyniki.txt. Kod dołaczyłem do tego posta. Mam nadzieję, że czegoś się nauczysz dzięki temu. A i dołaczyłem też oryginalne pliki, które wysłałeś - tylko w jednym poprawiłęm nazwę. Zamieszczając pełne dane oraz pokazując, że coś tam próbowałeś zrobić samodzielnie uzyskałeś rezultat, bo często kroś nie dołacza kodu ani przykłądowych plików, nie pisze o co chodzi i ciężko jest mu wtedy pomóc, nawet jak są chętni.

0

Dzięki! W sumie z tego sposobu mało rozumiem, nawet nie wiem jak to rozgryźć, bo po przeczytaniu dokumentacji nie wiele przyswoiłem. Teraz mi jeszcze zostało dopisanie przenoszenie tych wszystkich plików do jednego folderu, ale w tym chyba nie będzie problemu,najwyżej napisze jeszcze raz :)

0

Proszę bardzo, cieszę się, że mogłem pomóc. Dzięki Writeln wiesz co robi dany kod pod nią. Więcej o wyrażeniach regularnych znajdziesz w dokumentacji wspomnianego modułu oraz na google, a sortowanie opisane jest w pomocy, tak samo jak własności komponentów. Ważne, że kod wykonuje się jakieś osiem sekund, na pewno jest to i tak o wiele szybciej niż wycinannie znaków po jednym przy pętli dla pliku z najnowszymi. A czas jest i tak dlatego znaczący, bo wyrażenie regularne musi sparsować ponad siedmio meganajtowy plik piosenki.txt, a to trwa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1