كيف يمكنني استيراد ملف نصي محدد بمسافات بيضاء إلى MySQL؟

StackOverflow https://stackoverflow.com/questions/156532

سؤال

أحتاج إلى استيراد ملفات نصية كبيرة الحجم (24 ميجابايت) إلى جدول MySQL.كل سطر يبدو كالتالي:

1 1 0.008  0  0  0  0  0                                    

توجد مسافة واحدة أو أكثر بعد كل حقل، ويتم ذيل الحقل الأخير بحوالي 36 مسافة قبل السطر الجديد.

كيف يمكنني استيراد مثل هذا الملف إلى MySQL؟يبدو من الوثائق أن LOAD DATA تتوقع إنهاء جميع الحقول بنفس السلسلة تمامًا.لقد حاولت

LOAD DATA INFILE 'filename' INTO TABLE mytable FIELDS TERMINATED BY ' ';

لكن MySQL سوف تفسر تسلسلاً لأكثر من مسافة واحدة على أنه تحديد لحقل فارغ.

أيه أفكار؟

هل كانت مفيدة؟

المحلول

إذا كنت على يونيكس / لينكس ثم يمكنك وضعه من خلال الحوار الاقتصادي الاستراتيجي.

وفتح محطة واكتب:

sed 's/ \+/ /g' thefile > thefile.new

وهذا يحل محل جميع متواليات من المسافات المتعددة مع مسافة واحدة.

نصائح أخرى

إذا كنت على ويندوز، فقط استخدام Excel.

وإكسل واستيراد ملف محدد البيضاء (راجع "معاملة المحددات التالية واحدة" مربع من القائمة استيراد).

وبعد ذلك يمكنك ببساطة حفظ الملف كملف CSV من Excel و استيراد إلى الخلية باستخدام:

LOAD DATA INFILE 'filename' INTO TABLE mytable FIELDS TERMINATED BY ','; 

ويمكنك أيضا استخدام نفس الأمر المرسلة بواسطة Jauco لتغيير محدد ل'؛' أو \ ن. ومن شأن ذلك أن يساعد أيضا.

ألا توجد طريقة يمكنك من خلالها القيام بذلك بشكل عملي؟سيكون برنامج PHP النصي البسيط قادرًا على تحميل الملف وتقسيمه بمسافات وإجراء عملية إدراج في أي وقت من الأوقات على الإطلاق:

<?php

$db = mysql_connect('host', 'user', 'password')
or die('Failed to connect');
mysql_select_db('database', $db);

$fileHandle= @fopen("import.file", "r");
if ($fileHandle) {
    while (!feof($fileHandle)) {
        $rawLine = fgets($fileHandle, 4096);

        $columns = preg_split("/\s+/", $rawLine);

        //Construct and run an INSERT statement here ...   

    }
    fclose($fileHandle);
}

?>

يحررما قيل، جاكال الاقتراح أجمل بكثير ;)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top