আমি জাভাতে কোনও স্ট্রিং থেকে ফাইল এক্সটেনশানটি কীভাবে ছাঁটাই করব?


177

জাভাতে প্রত্যয়টি ছাঁটাই করার সবচেয়ে কার্যকরী উপায় কী, এরকম:

title part1.txt
title part2.html
=>
title part1
title part2

2
দক্ষ কোড
ওয়াইজ

3
তিনি কীভাবে এটি করবেন তা জিজ্ঞাসা করছিলেন না, তিনি জিজ্ঞাসা করছিলেন সবচেয়ে দক্ষ উপায় কোনটি। আমি একই জিনিস খুঁজছেন এখানে এসেছেন।
এডওয়ার্ড ফ্যালক

উত্তর:


285

এটি কোডের বাছাই যা আমাদের নিজের করা উচিত নয়। জাগতিক জিনিসগুলির জন্য লাইব্রেরি ব্যবহার করুন, শক্ত স্টাফের জন্য আপনার মস্তিষ্ককে সংরক্ষণ করুন।

এই ক্ষেত্রে, আমি অ্যাপাচি কমন্স আইও থেকে ফাইলের নাম ইউটিলেস.রেমো এক্সটেনশন () ব্যবহার করার পরামর্শ দিচ্ছি


7
একেবারে ঝাঁকুনি।
জোশুয়া পিন্টার

6
প্রকল্পের 95% এর জন্য, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এরকম পুনর্লিখনের কোডটি অনেক মাথাব্যথার মূল কারণ!
কার্স্টেন হফম্যান

1
অবক্ষয় যোগ করতে কেবল গ্রেডে নিম্নোক্ত রেখাটি যুক্ত করুন: - 'কমন্স-আইও: কমন্স-আইও: ২.6' সংকলন করুন
দীপক শর্মা

উদাহরণস্বরূপ
জন ktejik

8
আপনার প্রকল্পে ইতিমধ্যে যদি অ্যাপাচি কমন্স আই / ও থাকে তবে এটি ঠিক। তবে যদি আপনার এটির দরকার হয় তবে আপনি কোনও প্রকল্পের জন্য (কমপক্ষে) 2.5 এমবি মৃত ওজন যুক্ত করছেন যা কোনও একক লাইনের সাহায্যে সহজেই করা যায়।
foo বিন্যাস

227
str.substring(0, str.lastIndexOf('.'))

8
এটি স্ট্রিম পরিবর্তিত না হওয়ায় এটি একটি নতুন ভেরিয়েবলকে বরাদ্দ করা উচিত।
নাথান ফেজার

51
যত্ন সহকারে পরিচালনা করুন: যদি ফাইলের নামের প্রত্যয় না থাকে তবে এটি আপনার কাছে একটি ব্যতিক্রম ছুঁড়ে ফেলবে।
আন্দ্রেয়াস ডলক

24
আর্কাইভ.টার.বিজ 2 সম্পর্কে কী?
আন্তোনিও

20
if(str.contains(".")) str.substring(0, str.lastIndexOf('.'))
নিকোলাস টাইলার

6
যদি (str! = নাল && str.contains ("।")) str.substring (0, str.lastIndexOf ('।'))। ফাইলের নাম
ইউটিলস

88

ব্যবহার String.substringএবং String.lastIndexএকটি এক মাছ ধরার নৌকা ভাল কাজে, সেখানে নির্দিষ্ট কিছু ফাইল পাথ সঙ্গে মানিয়ে নিতে সক্ষম হচ্ছে পরিপ্রেক্ষিতে কিছু বিষয় আছে।

উদাহরণস্বরূপ নিম্নলিখিত পথটি ধরুন:

a.b/c

ওয়ান-লাইনার ব্যবহারের ফলাফল হবে:

a

এটা ভুল।

ফলাফলটি হওয়া উচিত ছিল c, তবে যেহেতু ফাইলটির একটি এক্সটেনশনের অভাব ছিল, তবে সেই পথে .নামের সাথে একটি ডিরেক্টরি ছিল , ওয়ান-লাইনার পদ্ধতিটিকে ফাইলের নাম হিসাবে পাথের অংশ দেওয়ার জন্য ট্রিক করা হয়েছিল, যা সঠিক নয়।

চেক প্রয়োজন

দ্বারা অনুপ্রাণিত skaffman এর উত্তর , আমি নিয়ে গবেষণা শুরু করেন FilenameUtils.removeExtensionপদ্ধতি এ্যাপাচি কমন্স আই

এর আচরণটি পুনরায় তৈরি করতে, আমি নতুন পদ্ধতিটি পূরণ করতে হবে এমন কয়েকটি পরীক্ষা লিখেছি, যা নিম্নলিখিত:

পথ ফাইল নাম
-------------- --------
/ বি / CC
a / b / c.jpg গ
a / b / c.jpg.jpg c.jpg

AB / CC
ab / c.jpg গ
ab / c.jpg.jpg c.jpg

সিসি
c.jpg গ
c.jpg.jpg c.jpg

(এবং আমি যা যা যা করেছি তার সবই - সম্ভবত অন্যান্য চেক রয়েছে যা আমি উপেক্ষা করেছি place

রুপায়ণ

removeExtensionপদ্ধতিটির জন্য আমার প্রয়োগটি নিম্নলিখিত :

public static String removeExtension(String s) {

    String separator = System.getProperty("file.separator");
    String filename;

    // Remove the path upto the filename.
    int lastSeparatorIndex = s.lastIndexOf(separator);
    if (lastSeparatorIndex == -1) {
        filename = s;
    } else {
        filename = s.substring(lastSeparatorIndex + 1);
    }

    // Remove the extension.
    int extensionIndex = filename.lastIndexOf(".");
    if (extensionIndex == -1)
        return filename;

    return filename.substring(0, extensionIndex);
}

removeExtensionউপরোক্ত পরীক্ষাগুলি সহ এই পদ্ধতিটি চালানো উপরের তালিকাভুক্ত ফলাফল দেয়।

পদ্ধতিটি নিম্নলিখিত কোড সহ পরীক্ষা করা হয়েছিল। যেহেতু এটি উইন্ডোতে চালিত হয়েছিল, পাথ বিভাজক একটি \যা আক্ষরিক \অংশ হিসাবে ব্যবহারের সাথে পালাতে হবে String

System.out.println(removeExtension("a\\b\\c"));
System.out.println(removeExtension("a\\b\\c.jpg"));
System.out.println(removeExtension("a\\b\\c.jpg.jpg"));

System.out.println(removeExtension("a.b\\c"));
System.out.println(removeExtension("a.b\\c.jpg"));
System.out.println(removeExtension("a.b\\c.jpg.jpg"));

System.out.println(removeExtension("c"));
System.out.println(removeExtension("c.jpg"));
System.out.println(removeExtension("c.jpg.jpg"));

ফলাফলগুলি ছিল:

c
c
c.jpg
c
c
c.jpg
c
c
c.jpg

ফলাফলটি পরীক্ষার মধ্যে বর্ণিত পছন্দসই ফলাফলগুলি পদ্ধতিটি পূরণ করা উচিত।


4
দুর্দান্ত উত্তর। আপনি ব্যবহার করছেন System.getProperty("file.separator")এবং না শুধুমাত্র একটি বিশেষ কারণ আছে File.separator?
হালিরুটান

2
সতর্কতার শব্দ: এই দ্রবণটি পূর্ববর্তী পথটি সরিয়ে ফেলেছে, অ্যাপাচি কমন্স আইও পদ্ধতির বিপরীতে কেবল এক্সটেনশনটি নয়।
ডিএইচএ

3
এটি প্রদর্শিত হয়/path/to/.htaccess
কুজেকো

17

বিটিডাব্লু, আমার ক্ষেত্রে, যখন আমি একটি নির্দিষ্ট এক্সটেনশন সরানোর জন্য দ্রুত সমাধান চেয়েছিলাম, এটি প্রায় আমার কাজ:

  if (filename.endsWith(ext))
    return filename.substring(0,filename.length() - ext.length());
  else
    return filename;

16
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));

4
না, একের বেশি '' থাকতে পারে ' আপনি সর্বশেষ তালিকাটি চান ('।')
অ্যাডাম জ্যাসকিউইচ

-1 আপনি যে পদ্ধতিটি ব্যবহার করছেন তা ব্যবহার না করার জন্য। এটি এখন আমার কাছ থেকে মোট +0। তাড়াতাড়ি পরিবর্তন করুন! ;)
মাইকেল মায়ার্স

7
String fileName="foo.bar";
int dotIndex=fileName.lastIndexOf('.');
if(dotIndex>=0) { // to prevent exception if there is no dot
  fileName=fileName.substring(0,dotIndex);
}

এটা কি একটা কৌশলী প্রশ্ন? : P

আমি এটিএম আরও দ্রুততর উপায়ের কথা ভাবতে পারি না।


7

com.google.common.io.Filesশ্রেণিতে একটি পদ্ধতি ব্যবহার করুন যদি আপনার প্রকল্পটি ইতিমধ্যে গুগল কোর লাইব্রেরিতে নির্ভর করে। আপনার যে পদ্ধতিটি প্রয়োজন তা হ'ল getNameWithoutExtension


কেন কেউ আমার উত্তরের বিপরীতে ??
টবি

মনে রাখবেন এটি কেবলমাত্র বেস নামটি দেয়, তাই পথটিও
সোমবার

6

আপনি এই ফাংশনটি চেষ্টা করতে পারেন, খুব বেসিক

public String getWithoutExtension(String fileFullPath){
    return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}

5

আমি কুলবার্ডের উত্তরটি বিশেষভাবে দরকারী বলে মনে করেছি।

তবে আমি শেষ ফলাফলের বিবৃতিগুলিতে পরিবর্তন করেছি:

if (extensionIndex == -1)
  return s;

return s.substring(0, lastSeparatorIndex+1) 
         + filename.substring(0, extensionIndex);

যেমন আমি চেয়েছিলাম পুরো পথের নামটি ফিরে আসুক।

সুতরাং "সি: \ ব্যবহারকারীগণ \ mroh004.COM \ নথি \ পরীক্ষা \ Test.xML" হয়ে যায় 
   "সি: \ ব্যবহারকারীগণ ro mroh004.COM \ নথি \ পরীক্ষা \ পরীক্ষা" এবং না
   "টেস্ট"

5
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();

3
যা জিজ্ঞাসা করা হয়েছিল তার বিপরীতে এবং দৈর্ঘ্যটি পাস করার প্রয়োজন নেই, কেবল একটি

4

একটি রেজেক্স ব্যবহার করুন। এটি সর্বশেষ বিন্দু এবং এর পরে সমস্ত কিছু প্রতিস্থাপন করে।

String baseName = fileName.replaceAll("\\.[^.]*$", "");

আপনি যদি রেজেক্স প্রাকপাইল করতে চান তবে আপনি একটি প্যাটার্ন অবজেক্টও তৈরি করতে পারেন।


1
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");

"\\.""হিসাবে বিভক্ত করা প্রয়োজন ।" রেজেক্সের জন্য বিশেষ।
কম্পাস

1

স্ট্রিং ইমেজ পাথ সহ একটি নতুন ফাইল তৈরি করুন

String imagePath;
File test = new File(imagePath);
test.getName();
test.getPath();
getExtension(test.getName());


public static String getExtension(String uri) {
        if (uri == null) {
            return null;
        }

        int dot = uri.lastIndexOf(".");
        if (dot >= 0) {
            return uri.substring(dot);
        } else {
            // No extension.
            return "";
        }
    }

1

org.apache.commons.io.FilenameUtils সংস্করণ 2.4 নিম্নলিখিত উত্তর দেয় gives

public static String removeExtension(String filename) {
    if (filename == null) {
        return null;
    }
    int index = indexOfExtension(filename);
    if (index == -1) {
        return filename;
    } else {
        return filename.substring(0, index);
    }
}

public static int indexOfExtension(String filename) {
    if (filename == null) {
        return -1;
    }
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
    int lastSeparator = indexOfLastSeparator(filename);
    return lastSeparator > extensionPos ? -1 : extensionPos;
}

public static int indexOfLastSeparator(String filename) {
    if (filename == null) {
        return -1;
    }
    int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
    int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
    return Math.max(lastUnixPos, lastWindowsPos);
}

public static final char EXTENSION_SEPARATOR = '.';
private static final char UNIX_SEPARATOR = '/';
private static final char WINDOWS_SEPARATOR = '\\';


0

আমি এটি করতে চাই:

String title_part = "title part1.txt";
int i;
for(i=title_part.length()-1 ; i>=0 && title_part.charAt(i)!='.' ; i--);
title_part = title_part.substring(0,i);

'' অবধি শেষ হচ্ছে। তারপরে সাবস্ট্রিং কল করুন।

সম্পাদনা করুন: গল্ফ হতে পারে না তবে এটি কার্যকর :)


7
এটিই মূলত সর্বশেষ সূচকটি যাই হোক না কেন; চাকা পুনরুদ্ধার কেন?
মাইকেল মায়ার্স

মজা করার জন্য এবং কিছুটা বর্ণনামূলক হতে। হ্যাঁ ওটাই. (এবং আমি যখন এটি লিখছিলাম তখন আমি সর্বশেষ সূচক সম্পর্কে ভুলে গিয়েছিলাম)
fmsf

0

কোনও ফাইল এক্সটেনশন নেই বা একাধিক ফাইল এক্সটেনশন নেই এমন পরিস্থিতিতে পরিস্থিতি মাথায় রেখে

উদাহরণস্বরূপ ফাইলের নাম: ফাইল | file.txt | file.tar.bz2

/**
 *
 * @param fileName
 * @return file extension
 * example file.fastq.gz => fastq.gz
 */
private String extractFileExtension(String fileName) {
    String type = "undefined";
    if (FilenameUtils.indexOfExtension(fileName) != -1) {
        String fileBaseName = FilenameUtils.getBaseName(fileName);
        int indexOfExtension = -1;
        while (fileBaseName.contains(".")) {
            indexOfExtension = FilenameUtils.indexOfExtension(fileBaseName);
            fileBaseName = FilenameUtils.getBaseName(fileBaseName);
        }
        type = fileName.substring(indexOfExtension + 1, fileName.length());
    }
    return type;
}

0
String img = "example.jpg";
// String imgLink = "http://www.example.com/example.jpg";
URI uri = null;

try {
    uri = new URI(img);
    String[] segments = uri.getPath().split("/");
    System.out.println(segments[segments.length-1].split("\\.")[0]);
} catch (Exception e) {
    e.printStackTrace();
}

এটি img এবং imgLink উভয়ের জন্য আউটপুট উদাহরণ দেবে


0
public static String removeExtension(String file) {
    if(file != null && file.length() > 0) {
        while(file.contains(".")) {
            file = file.substring(0, file.lastIndexOf('.'));
        }
    }
    return file;
}

এটি "a.jpg.jpg" ("সঠিক") "a.jpg" এর পরিবর্তে "a" তে রূপান্তর করবে। কি উদ্দেশ্য file.length() > 0চেক পরিবেশন করে ?
ক্লাউস গ্যাটার

মূল প্রশ্নটি ছিল "কীভাবে এক্সটেনশন সরান?", সুতরাং হ্যাঁ এটি "a.txt.zip" কে "a" এবং ".htaccess" এ শূন্যপদে রূপান্তরিত করে। স্ট্রিংসের সাথে এই ফাংশনটি কাজ করে, সুতরাং ফাইলের নামগুলি শূন্য হতে পারে না তবে তবুও 0 দৈর্ঘ্য হতে পারে, প্রতীকগুলি পার্সিংয়ের আগে এটি মূল্যবান কিনা তা দ্রুত পরীক্ষা করুন। শুভেচ্ছা।
আলেক্সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.