У меня есть такой файл
FG 09097612 DN 6575 HL 879797
BHC 09097613 DN 6576 HL 879798
FG 09097614 DN 6577 IOPPP 879799
FG 09097614 DN 6577 IOPPP 879800
и я импортирую его в mysql с помощью
$lines = file("upload/import.txt");
$dbhandle = odbc_connect("Driver={SQL Server Native Client 11.0};
Server=$myServer;Database=$myDB;", $myUser, $myPass)
or die("Couldn't connect to SQL Server on $myServer");
$query = "INSERT INTO TEST (nation) VALUES \n";
$row = array(); // query for each line
foreach($lines as $lineNum => $line ) {
$nation = trim(substr($line, 0, 4)); // get first four characters as nation and remove spaces
$prize = trim(substr($line, 4, 8)); // get 5th-12th characters as prize and remove spaces
$player = trim(substr($line, 12, 2)); // get 13th-14th characters as player and remove spaces
$row []= "(".$nation.")";
}
$query .= implode(",\n",$row).";";
$result = odbc_exec($dbhandle, $query);
Теперь мне нужно проверить, есть ли в файле строки с одной и той же нацией, в этом примере "FG" и суммировать $prize
каждого "FG" и сохранять только общую сумму в выигрыше, а не все строки FG?
Если вам нужно сделать это в php, я бы сохранил строки в массиве, набранном нацией, и каждый раз проверял, существует ли этот ключ, и если это так просто увеличивает выигрыш.
Что-то вроде этого:-
<?php
$lines = file("upload/import.txt");
$dbhandle = odbc_connect("Driver={SQL Server Native Client 11.0};
Server=$myServer;Database=$myDB;", $myUser, $myPass)
or die("Couldn't connect to SQL Server on $myServer");
$query = "INSERT INTO TEST (nation, prize) VALUES \n";
$row = array(); // query for each line
foreach($lines as $lineNum => $line )
{
$nation = trim(substr($line, 0, 4)); // get first four characters as nation and remove spaces
if (array_key_exists($nation, $row))
{
$row[$nation]['prize'] += $prize;
}
else
{
$prize = trim(substr($line, 4, 8)); // get 5th-12th characters as prize and remove spaces
$player = trim(substr($line, 12, 2)); // get 13th-14th characters as player and remove spaces
$row[$nation]= array('nation'=>$nation, 'prize'=>$prize);
}
}
array_walk($row, function($v, $k){return "(".$v['nation'].", ".$v['prize'].")";});
$query .= implode(",\n",$row).";";
$result = odbc_exec($dbhandle, $query);
?>
Однако, если это было сделано в MySQL, у меня возникло бы желание просто наделить страну уникальным ключом в базе данных и добавить в конец запроса на вставку ON DUPLICATE KEY SET приз = приз + VALUES (приз).
Вы можете написать действительно сложный PHP-код для этого. Или вы можете изменить свою стратегию. Во-первых, позвольте мне указать, что вы можете просто использовать load data infile
для чтения данных из файла.
Новая стратегия состоит в том, чтобы прочитать данные в промежуточную таблицу и затем скопировать ее в итоговую таблицу. В основном:
read data into test_staging table (using php or 'load data infile')
insert into test(nation, prize)
select nation, sum(prize)
from test_staging
group by nation;
drop table test_staging;
Поэтому, если вам это нужно в PHP, я бы предложил использовать именованный массив следующим образом:
$insertLines = array();
foreach($lines as $lineNum => $line ) {
$nation = trim(substr($line, 0, 4)); // get first four characters as nation and remove spaces
$prize = trim(substr($line, 4, 8)); // get 5th-12th characters as prize and remove spaces
insertLines[$nation] += $prize;
}
foreach($insertLines as $lineNation => $linePrice ) {
// The creation of the insert into the database goes here.
}
И, пожалуйста, проверьте длину. Я думаю, что на плазме в 14-15?
$player = trim(substr($line, 13, 2));