Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> загрузка csv в StringGrid 
:(
    Опции темы
Driv3r
Дата 5.11.2005, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 3.7.2005

Репутация: нет
Всего: нет



Попорбовал сделать так:
Код

procedure TForm2.BitBtn11Click(Sender: TObject);
var
f: TextFile;
St,q: String;
u,row:integer;

begin
if OpenDialog1.Execute then
begin
begin
AssignFile(f, OpenDialog1.FileName);
Reset(f);
try
row:=0;
While not Eof(f) Do
Begin
row:=row+1;
for u:=0 to 10 do begin // в гриде 11 столбцов
while St<>';' do begin 
ReadLn(f, St);
q:=q+St;
end;
With StringGrid1 Do begin
Cells[u,row];
Cells[u,row]:=q;
end;
end;

End;
finally
CloseFile(f);
end;
end;
end;
end;



Прога при этом виснет.Пробовал по разному но всё равно не грузит в StringGrid . Может чего посоветуете?

Это сообщение отредактировал(а) Girder - 5.11.2005, 20:49
PM MAIL   Вверх
Albinos_x
Дата 5.11.2005, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



ясен фиг:

Цитата(Driv3r @ 5.11.2005, 17:27)
while St<>';' do begin
ReadLn(f, St);
q:=q+St;

что этим пытаешся сделать?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Driv3r
Дата 5.11.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 3.7.2005

Репутация: нет
Всего: нет



Пытаюсь считать данные до разделителя ;
PM MAIL   Вверх
Poseidon
Дата 5.11.2005, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Цитата(Driv3r @ 5.11.2005, 19:14)
Пытаюсь считать данные до разделителя ;
А он есть?

PS. Простите меня глупого, но что такое "csv"?



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Driv3r
Дата 5.11.2005, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 3.7.2005

Репутация: нет
Всего: нет



Это формат файлов которые открываются Экселем.Имеют вид типа
Цитата

Данные;1;2;3;4;5;6;7;0;0;
Данные2;1;2;3;4;5;6;7;0;0;
Итого;2;1;3;4;5;6;7;0;0;

; разделяет столбцы.
PM MAIL   Вверх
Albinos_x
Дата 5.11.2005, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата
ReadLn(f, St);

но ты же читаешь по-строчно, строка не равна символу ';', поэтому у тебя и уходит в бесконечный цыкл
тебе нужно сначало считывать строку и её уже перебирать от начала и до конца... или считывать по-символьно...

Цитата
for u:=0 to 10 do begin // в гриде 11 столбцов
while St<>';' do begin

и вообще я не могу найти инициализацию переменной St, в неё следует сначала считать, а потом уже проверять... тогда бы стоило использовать цикл с постусловием...
Добавлено @ 21:09
Цитата
Cells[u,row];

эта (24-ая) строка мне вообще не понятна...???

Это сообщение отредактировал(а) Albinos_x - 5.11.2005, 21:06


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Wild User
Дата 5.11.2005, 21:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Когда мне приспичило, я нашёл в и-нет такой код
И грузи CSV и XLS-файлы

Код

uses
  ComObj;

function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  // Create Excel-OLE Object
  XLApp := CreateOleObject('Excel.Application');
  try
    // Hide Excel
    XLApp.Visible := False;

    // Open the Workbook
    XLApp.Workbooks.Open(AXLSFile);

    // Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];

    // In order to know the dimension of the WorkSheet, i.e the number of rows
    // and the number of columns, we activate the last non-empty cell of it

    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
    // Get the value of the last row
    x := XLApp.ActiveCell.Row;
    // Get the value of the last column
    y := XLApp.ActiveCell.Column;

    // Set Stringgrid's row &col dimensions.

    AGrid.RowCount := x;
    AGrid.ColCount := y;

    // Assign the Variant associated with the WorkSheet to the Delphi Variant

    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
    //  Define the loop for filling in the TStringGrid
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    // Unassign the Delphi Variant Matrix
    RangeMatrix := Unassigned;

  finally
    // Quit Excel
    if not VarIsEmpty(XLApp) then
    begin
      // XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Xls_To_StringGrid(StringGrid1, 'C:\Table1.xls') then
    ShowMessage('Table has been exported!');
end;


  Вверх
Albinos_x
Дата 5.11.2005, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Wild User
этот код будет долго работать....


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
allx
Дата 6.11.2005, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 1.9.2005

Репутация: нет
Всего: нет



А если вот так:

Код

....
while not Eof(f) do begin
  ReadLn(f, St);
  st:=StringReplace(st,';',#13#10,[rfReplaceAll]);
  StringGrid1.Rows[i].SetText(pchar(st));
  inc(i);
end;


Будьте проще, люди к вам потянутся smile)

Это сообщение отредактировал(а) allx - 6.11.2005, 11:36
PM MAIL   Вверх
Albinos_x
Дата 6.11.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



allx
ты свой вариан проверял?


я бы вот так сделал бы:
Код

procedure TForm1.BitBtn1Click(Sender: TObject);
var
   f: TextFile;
   St: String;
   List:TStringlist;
   row,i:integer;
begin
list:=TStringList.Create;
list.Clear;
if not OpenDialog1.Execute then
     begin
     MessageDlg('Файл не открыт.',mtError,[mbOk],0);
     Exit;
     end;
AssignFile(f, OpenDialog1.FileName);
Reset(f);
List.Delimiter:=';';
row:=1;
while not Eof(f) do
  begin
  ReadLn(f, St);
  List.DelimitedText:=st;
  for i:=0 to (List.Count-1) do
      StringGrid1.Cells[i+1,row]:=list.Strings[i];
  inc(row);
  end;
CloseFile(f);
end;


работает... проверял...

Это сообщение отредактировал(а) Albinos_x - 6.11.2005, 14:33


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
allx
Дата 6.11.2005, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 1.9.2005

Репутация: нет
Всего: нет



Albinos_x
А че ему собсно не работать-то smile)

вот, неполенился, проверил: готовый текст

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  st: string;
  f: TextFile;
  i: integer;
  od1: TOpenDialog;
begin
  od1:=TOpenDialog.Create(self);
  if od1.Execute then begin
       i:=0;
       AssignFile(f, od1.FileName);
       Reset(f);
       while not Eof(f) do begin
         ReadLn(f, St);
         st:=StringReplace(st,';',#13#10,[rfReplaceAll]);
         StringGrid1.Rows[i].SetText(pchar(st));
         inc(i);
       end; 
  end;
  od1.free;
end;


Это сообщение отредактировал(а) allx - 6.11.2005, 18:18
PM MAIL   Вверх
Albinos_x
Дата 6.11.2005, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(allx @ 6.11.2005, 16:44)
А че ему собсно не работать-то

прошу прощения... эт у меня ошибка была... когда твой вариант проверял.... smile
Добавлено @ 16:59
вот ещё думаю в твой вариант надо добавить:
Код
...
         inc(i);    
       end;
  end;
  od1.Free;  // освободить память
end;
...


Это сообщение отредактировал(а) Albinos_x - 6.11.2005, 17:00


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
allx
Дата 6.11.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 1.9.2005

Репутация: нет
Всего: нет



Albinos_x
Цитата
вот ещё думаю в твой вариант надо добавить:

Точно. Пост поправил.
PM MAIL   Вверх
~FoX~
Дата 7.11.2005, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



А я это через ADO реализовывал...
Код

procedure TSCRemont.Button6Click(Sender: TObject);
var
  s: String;
begin
  OpenDialog1.Execute;
  s:= OpenDialog1.FileName;
  with ADOQuery4 do begin
    ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + s + ';Extended Properties=Excel 8.0;Persist Security Info=False';
    Active := false;
    SQL.Clear;
    SQL.Add('Select * From [Лист1$]');
    Active := True;
  end;
  FullGridFromXLS; // ======Заполняем грид из Екселя
  ADOQuery4.Active := False;
end;

procedure FullGridFromXLS();// ======Заполняем грид из Екселя
var
  i: integer;
begin
  i:=0;
  with SCRemont do begin
    StringGrid1.RowCount := ADOQuery4.RecordCount;
    with ADOQuery4 do begin
      first;
      while not EOF do begin
        i:=i+1;
        StringGrid1.Cells[1, i] := ADOQuery4.FieldByName('Сервисный центр').AsString;
        StringGrid1.Cells[2, i] := ADOQuery4.FieldByName('Отчет №').AsString;
        StringGrid1.Cells[3, i] := ADOQuery4.FieldByName('Дата отчета').AsString;
        StringGrid1.Cells[4, i] := ADOQuery4.FieldByName('С/номер').AsString;
        StringGrid1.Cells[5, i] := ADOQuery4.FieldByName('Модель').AsString;
        StringGrid1.Cells[6, i] := ADOQuery4.FieldByName('Установленный дефект').AsString;
        StringGrid1.Cells[7, i] := ADOQuery4.FieldByName('Замена детали').AsString;
        StringGrid1.Cells[8, i] := ADOQuery4.FieldByName('Примечание').AsString;
        StringGrid1.Cells[9, i] := ADOQuery4.FieldByName('Дата').AsString;
        StringGrid1.Cells[10, i] := ADOQuery4.FieldByName('Время').AsString;
        StringGrid1.Cells[11, i] := ADOQuery4.FieldByName('Цена детали').AsString;
        StringGrid1.Cells[12, i] := ADOQuery4.FieldByName('Сумма ремонта').AsString;
        next;
      end;//while
    end; //with ADO
  end;  // with Form
end;

Может пригадиться кому smile


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1311 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.